【问题标题】:xpath find location in documentxpath 在文档中查找位置
【发布时间】:2012-04-08 08:14:07
【问题描述】:

尝试在以下 XML 文档中查找“aging-timer”的值:

<ospf3-database-information xmlns="http://xml.juniper.net/junos/11.1R2/junos-routing">
    <ospf3-database external-heading="OSPF3">
        <lsa-type>Extern</lsa-type>
        <lsa-id>0.0.0.1</lsa-id>
        <advertising-router>172.27.255.6</advertising-router>
        <sequence-number>0x80000001</sequence-number>
        <age>1792</age>
        <checksum>0x90bd</checksum>
        <lsa-length>28</lsa-length>
        <ospf3-external-lsa>
            <ospf3-prefix>::/0</ospf3-prefix>
            <ospf3-prefix-options>0x0</ospf3-prefix-options>
            <type-value>1</type-value>
            <metric>0</metric>
        </ospf3-external-lsa>
        <ospf-database-extensive>
            <aging-timer junos:seconds="1808">
                00:30:08
            </aging-timer>
            <installation-time junos:seconds="1790">
                00:29:50
            </installation-time>
            <expiration-time junos:seconds="1808">
                00:30:08
            </expiration-time>
            <send-time junos:seconds="1790">
                00:29:50
            </send-time>
            <lsa-changed-time junos:seconds="1790">
                00:29:50
            </lsa-changed-time>
            <lsa-change-count>1</lsa-change-count>
        </ospf-database-extensive>
    </ospf3-database>
</ospf3-database-information>

唯一需要注意的是,如果“ospf3-prefix”的文本为 ::/0,我只需要它。 我正在尝试这个 xpath:

//x:ospf3-external-lsa[x:ospf3-prefix=\"::/0\"]/ancestor::x:ospf3-database/x:ospf-database-extensive/x:aging-timer

在 perl 中使用 x 处理命名空间:

   my $xdatav6 = XML::LibXML->load_xml(string => $defv6);
   my $dataxv6 = XML::LibXML::XPathContext->new($xdatav6);
   $dataxv6->registerNs("x", "http://xml.juniper.net/junos/11.1R2/junos-routing");

但这不起作用,似乎当我使用祖先时,它可以抓取除“ospf-database-extensive”树下的任何内容之外的所有内容。

【问题讨论】:

  • 试图找到什么值?
  • 抱歉,我添加了一个编辑。老化计时器的值。
  • 我没有看到任何明显的错误——你有点暗示你已经做了一些调试——特别是你确定:(1) //x:ospf3-external-lsa[ x:ospf3-prefix=\"::/0\"] 正在选择正确的节点; (2) 祖先::x:ospf3-database 选择了正确的节点,但 (3) 然后找不到子 ospf-database-extensive 节点?
  • 是的,如果我有以下路径:"//x:ospf3-external-lsa[x:ospf3-prefix=\"::/0\"]/ancestor::x:ospf3 -database/x:ospf3-external-lsa/x:type-value",它正确打印 1
  • 好的,刚刚又运行了一次,看来我没有在文档中得到完整的响应。

标签: perl xpath xml-parsing


【解决方案1】:

您显示的 XML 无效,因为它没有 junos:seconds 中使用的 junos 命名空间的 URI。我将根标签更改为读取

xmlns:junos="http://xml.juniper.net/junos/11.1R2/junos-routing"

让事情顺利进行。

这是我见过的最长的 XPath 表达式,但它可以解决问题!根据需要放入适当的命名空间前缀。

/ospf3-database-information/ospf3-database[ospf3-external-lsa/ospf3-prefix="::/0"]/ospf-database-extensive/aging-timer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多