6.4 子树过滤示例

6.4.1 没有过滤器

<get>操作中省略过滤器将返回整个数据模型。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get/>
  4. </rpc>
  5. <rpc-reply message-id="101"
  6. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  7. <data>
  8. <!-- ... entire set of data returned ... -->
  9. </data>
  10. </rpc-reply>

6.4.2 空过滤器

空的过滤器将不会选择任何内容,因为没有内容匹配或选择节点存在。 这不是一个错误。 这些例子中使用的<filter>元素的“type”属性将在7.1节进一步讨论。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get>
  4. <filter type="subtree">
  5. </filter>
  6. </get>
  7. </rpc>
  8. <rpc-reply message-id="101"
  9. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  10. <data>
  11. </data>
  12. </rpc-reply>

6.4.3 选择整个<users>子树

这个例子中的过滤器包含一个选择节点(<users>),所以只有该子树被过滤器选中。 这个例子代表了下面大部分过滤器例子中的完全填充的<users>数据模型。 在真实的数据模型中,<company-info>不可能与特定主机或网络的用户列表一起返回。

注:本文档中使用的过滤和配置示例出现在命名空间“http://example.com/schema/1.2/config”中。 这个命名空间的根元素是<top><top>元素及其后代仅表示一个示例配置数据模型。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get-config>
  4. <source>
  5. <running/>
  6. </source>
  7. <filter type="subtree">
  8. <top xmlns="http://example.com/schema/1.2/config">
  9. <users/>
  10. </top>
  11. </filter>
  12. </get-config>
  13. </rpc>
  14. <rpc-reply message-id="101"
  15. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  16. <data>
  17. <top xmlns="http://example.com/schema/1.2/config">
  18. <users>
  19. <user>
  20. <name>root</name>
  21. <type>superuser</type>
  22. <full-name>Charlie Root</full-name>
  23. <company-info>
  24. <dept>1</dept>
  25. <id>1</id>
  26. </company-info>
  27. </user>
  28. <user>
  29. <name>fred</name>
  30. <type>admin</type>
  31. <full-name>Fred Flintstone</full-name>
  32. <company-info>
  33. <dept>2</dept>
  34. <id>2</id>
  35. </company-info>
  36. </user>
  37. <user>
  38. <name>barney</name>
  39. <type>admin</type>
  40. <full-name>Barney Rubble</full-name>
  41. <company-info>
  42. <dept>2</dept>
  43. <id>3</id>
  44. </company-info>
  45. </user>
  46. </users>
  47. </top>
  48. </data>
  49. </rpc-reply>

下面的过滤器请求会产生相同的结果,但只是因为容器<users>定义了一个子元素(<user>)。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get-config>
  4. <source>
  5. <running/>
  6. </source>
  7. <filter type="subtree">
  8. <top xmlns="http://example.com/schema/1.2/config">
  9. <users>
  10. <user/>
  11. </users>
  12. </top>
  13. </filter>
  14. </get-config>
  15. </rpc>

6.4.4. 选择<users>子树内的所有<name>元素

该过滤器包含两个容器节点(<users><user>)和一个选择节点(<name>)。 在过滤器输出中选择同一兄弟集合中<name>元素的所有实例。 客户端可能需要知道<name>在这个特定的数据结构中被用作实例标识符,但是服务器不需要知道该元数据来处理该请求。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get-config>
  4. <source>
  5. <running/>
  6. </source>
  7. <filter type="subtree">
  8. <top xmlns="http://example.com/schema/1.2/config">
  9. <users>
  10. <user>
  11. <name/>
  12. </user>
  13. </users>
  14. </top>
  15. </filter>
  16. </get-config>
  17. </rpc>
  18. <rpc-reply message-id="101"
  19. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  20. <data>
  21. <top xmlns="http://example.com/schema/1.2/config">
  22. <users>
  23. <user>
  24. <name>root</name>
  25. </user>
  26. <user>
  27. <name>fred</name>
  28. </user>
  29. <user>
  30. <name>barney</name>
  31. </user>
  32. </users>
  33. </top>
  34. </data>
  35. </rpc-reply>

6.4.5 一个特定的<user>条目

此过滤器包含两个容器节点(<users><user>)和一个内容匹配节点(<name>)。 在过滤器输出中选择包含<name>(其名称等于“fred”的值的兄弟集合的所有实例)。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get-config>
  4. <source>
  5. <running/>
  6. </source>
  7. <filter type="subtree">
  8. <top xmlns="http://example.com/schema/1.2/config">
  9. <users>
  10. <user>
  11. <name>fred</name>
  12. </user>
  13. </users>
  14. </top>
  15. </filter>
  16. </get-config>
  17. </rpc>
  18. <rpc-reply message-id="101"
  19. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  20. <data>
  21. <top xmlns="http://example.com/schema/1.2/config">
  22. <users>
  23. <user>
  24. <name>fred</name>
  25. <type>admin</type>
  26. <full-name>Fred Flintstone</full-name>
  27. <company-info>
  28. <dept>2</dept>
  29. <id>2</id>
  30. </company-info>
  31. </user>
  32. </users>
  33. </top>
  34. </data>
  35. </rpc-reply>

6.4.6 来自特定<user>条目的特定元素

该过滤器包含两个容器节点(<users><user>),一个内容匹配节点(<name>)和两个选择节点(<type><full-type>)。 在过滤器输出中选择包含<name>的相同同级组中的<type><full-name>元素的所有实例,其中<name>的值等于“fred”。 不包含<company-info>元素,因为兄弟集合包含选择节点。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get-config>
  4. <source>
  5. <running/>
  6. </source>
  7. <filter type="subtree">
  8. <top xmlns="http://example.com/schema/1.2/config">
  9. <users>
  10. <user>
  11. <name>fred</name>
  12. <type/>
  13. <full-name/>
  14. </user>
  15. </users>
  16. </top>
  17. </filter>
  18. </get-config>
  19. </rpc>
  20. <rpc-reply message-id="101"
  21. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  22. <data>
  23. <top xmlns="http://example.com/schema/1.2/config">
  24. <users>
  25. <user>
  26. <name>fred</name>
  27. <type>admin</type>
  28. <full-name>Fred Flintstone</full-name>
  29. </user>
  30. </users>
  31. </top>
  32. </data>
  33. </rpc-reply>

6.4.7 多个子树

这个过滤器包含三个子树(name = rootfredbarney)。

root”子树筛选器包含两个包含节点(<users><user>),一个内容匹配节点(<name>)和一个选择节点(<company-info>)。满足子树的选择条件,在过滤器输出中只选择“root”的company-info子树。

fred”子树筛选器包含三个包含节点(<users><user><company-info>),一个内容匹配节点(<name>)和一个选择节点(<id>)。满足子树的选择条件,在过滤器输出中只选择“fred”的company-info子树内的<id>元素。

barney”子树筛选器包含三个包含节点(<users><user><company-info>),两个内容匹配节点(<name><type>)和一个选择节点(<dept>)。由于用户“barney”不是“superuser”,并且“barney”(包括其父<user>条目)的整个子树被从过滤器输出中排除,所以不满足子树选择条件。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get-config>
  4. <source>
  5. <running/>
  6. </source>
  7. <filter type="subtree">
  8. <top xmlns="http://example.com/schema/1.2/config">
  9. <users>
  10. <user>
  11. <name>root</name>
  12. <company-info/>
  13. </user>
  14. <user>
  15. <name>fred</name>
  16. <company-info>
  17. <id/>
  18. </company-info>
  19. </user>
  20. <user>
  21. <name>barney</name>
  22. <type>superuser</type>
  23. <company-info>
  24. <dept/>
  25. </company-info>
  26. </user>
  27. </users>
  28. </top>
  29. </filter>
  30. </get-config>
  31. </rpc>
  32. <rpc-reply message-id="101"
  33. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  34. <data>
  35. <top xmlns="http://example.com/schema/1.2/config">
  36. <users>
  37. <user>
  38. <name>root</name>
  39. <company-info>
  40. <dept>1</dept>
  41. <id>1</id>
  42. </company-info>
  43. </user>
  44. <user>
  45. <name>fred</name>
  46. <company-info>
  47. <id>2</id>
  48. </company-info>
  49. </user>
  50. </users>
  51. </top>
  52. </data>
  53. </rpc-reply>

6.4.8 具有属性命名的元素

在此示例中,筛选器包含一个包含节点(<interfaces>),一个属性匹配表达式(“ifName”)和一个选择节点(<interface>)。 在过滤器输出中选择具有“ifName”属性等于“eth0”的<interface>子树的所有实例。 过滤器数据元素和属性是合格的,因为如果命名空间属性不合格,“ifName”属性将不被视为“schema/1.2”命名空间的一部分。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get>
  4. <filter type="subtree">
  5. <t:top xmlns:t="http://example.com/schema/1.2/stats">
  6. <t:interfaces>
  7. <t:interface t:ifName="eth0"/>
  8. </t:interfaces>
  9. </t:top>
  10. </filter>
  11. </get>
  12. </rpc>
  13. <rpc-reply message-id="101"
  14. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  15. <data>
  16. <t:top xmlns:t="http://example.com/schema/1.2/stats">
  17. <t:interfaces>
  18. <t:interface t:ifName="eth0">
  19. <t:ifInOctets>45621</t:ifInOctets>
  20. <t:ifOutOctets>774344</t:ifOutOctets>
  21. </t:interface>
  22. </t:interfaces>
  23. </t:top>
  24. </data>
  25. </rpc-reply>

如果“ifName”是一个子节点而不是一个属性,那么下面的请求会产生类似的结果。

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  3. <get>
  4. <filter type="subtree">
  5. <top xmlns="http://example.com/schema/1.2/stats">
  6. <interfaces>
  7. <interface>
  8. <ifName>eth0</ifName>
  9. </interface>
  10. </interfaces>
  11. </top>
  12. </filter>
  13. </get>
  14. </rpc>