xpath在文档中查找位置

时间:2012-03-23 18:43:06

标签: perl xpath xml-parsing

尝试在以下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

使用x来处理perl:

中的命名空间
   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 个答案:

答案 0 :(得分:1)

您显示的XML无效,因为它没有junos中使用的junos:seconds命名空间的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