xpath найти местоположение в документе - PullRequest
0 голосов
/ 23 марта 2012

Попытка найти значение «age-timer» в следующем XML-документе:

<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-extended".

1 Ответ

1 голос
/ 23 марта 2012

Отображаемый вами XML-код недействителен, так как не имеет URI для пространства имен junos, используемого в junos:seconds.Я изменил корневой тег на

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
...