2012-03-23 6 views
0

Пытаясь найти значение «старения таймера» в следующем документе XML:XPath находят место в документе

<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-приставка» имеет текст of ::/0. Я пытаюсь это:

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

с использованием х для обработки пространств имен в 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-wide».

+0

пытаясь найти значение чего? –

+0

Извините, я добавил изменение. Значение времени старения. – salparadise

+1

Я не вижу ничего неправильного - вы вроде бы подразумеваете, что сделали некоторую отладку - в частности, вы уверены, что: (1) // x: ospf3-external-lsa [x: ospf3-prefix = \ «::/0 \»] выбирает правильные узлы; и (2) база данных ancestor :: x: ospf3 выбирает правильный узел, но (3) он не может найти дочерний узел ospf-database-wide-node? –

ответ

1

Отображаемый 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 
Смежные вопросы