2015-07-15 3 views
2

У меня есть объект arptree, я пытаюсь найти mac-адрес ip-адреса, но не удалось.Использование xpath с lxml.etree._ElementTree

>>> arptree 
<lxml.etree._ElementTree object at 0x0000000004641688> 

Когда я пытаюсь следующий XPath, он возвращает пустой список

>>> arptree.xpath("descendant::mac-address[following-sibling::ip-address='10.69.119.150']") 
[] 

Если я изменить XPath, чтобы исключить «= '10 .69.119.150», он на самом деле возвращает список элементов.

>>> arptree.xpath("descendant::mac-address[following-sibling::ip-address]")      

[,,,,,,,,,]

можно использовать для цикла, чтобы получить доступ к содержимому. И я уверен, что есть mac-адрес для ip-адреса 10.69.119.150.

for elt in arptree.iter(): 
    print elt.tag, elt.text 

Странно, что если я скопирую и вставляю xml-вывод в xml-файл. Затем используйте:

from lxml import etree 
tree = etree.parse(open('arp.xml')) 
tree.xpath("descendant::mac-address[following-sibling::ip-address='10.69.119.150']") 

Она возвращает MAC-адрес для адреса IP.

Я использую Python 2.7.9 с пакетом lxml. Может ли кто-нибудь помочь?

Update 1: Пример XML

<arp-table-information> 
<arp-table-entry> 
    <mac-address>00:a0:a5:76:1a:96</mac-address> 
    <ip-address>10.69.119.130</ip-address> 
    <hostname>10.69.119.130</hostname> 
    <interface-name>vlan.49</interface-name> 
    <arp-table-entry-flags> 
     <none/> 
    </arp-table-entry-flags> 
</arp-table-entry> 
<arp-table-entry> 
    <mac-address>00:0f:bb:c6:26:3d</mac-address> 
    <ip-address>10.69.119.150</ip-address> 
    <hostname>10.69.119.150</hostname> 
    <interface-name>vlan.55</interface-name> 
    <arp-table-entry-flags> 
     <none/> 
    </arp-table-entry-flags> 
</arp-table-entry> 
</arp-table-information> 

Update 2: Пожалуйста, игнорируйте Update 1

Когда я использую

arptree = ex.device.rpc.get_arp_table_information().getroottree() 
arptree.write('arptree.xml', pretty_print=True) 

сохранить ElementTree в XML, изменения макета в

<arp-table-information style="normal"> 
<arp-table-entry> 
<mac-address> 
00:a0:a5:76:1a:96 
</mac-address> 
<ip-address> 
10.69.119.130 
</ip-address> 
<hostname> 
10.69.119.130 
</hostname> 
<interface-name> 
vlan.49 
</interface-name> 
<arp-table-entry-flags> 
<none/> 
</arp-table-entry-flags> 
</arp-table-entry> 
<arp-table-entry> 
<mac-address> 
00:0f:bb:c6:26:3d 
</mac-address> 
<ip-address> 
10.69.119.150 
</ip-address> 
<hostname> 
10.69.119.150 
</hostname> 
<interface-name> 
vlan.55 
</interface-name> 
<arp-table-entry-flags> 
<none/> 
</arp-table-entry-flags> 
</arp-table-entry> 

Возможно, поэтому следующий код не работает ???

arptree.xpath("descendant::mac-address[following-sibling::ip-address='10.69.119.150']") 

Основано на этом файле xml, может ли кто-нибудь помочь?

+2

Можете ли вы предоставить пример XML? – noxdafox

+1

как вы получаете свое 'arptree' в первую очередь? 'Fromstring'? – Anzel

+0

Я приведу пример в сообщении –

ответ

2

Во втором XML у вас есть новые строковые символы до и после значения IP-адреса. Вы можете использовать normalize-space() функцию, чтобы исправить:

descendant::mac-address[following-sibling::ip-address[normalize-space()='10.69.119.150']] 

работает пример для демонстрации:

from lxml import etree 

xml = """<arp-table-information style="normal"> 
<arp-table-entry> 
<mac-address> 
00:a0:a5:76:1a:96 
</mac-address> 
<ip-address> 
10.69.119.130 
</ip-address> 
<hostname> 
10.69.119.130 
</hostname> 
<interface-name> 
vlan.49 
</interface-name> 
<arp-table-entry-flags> 
<none/> 
</arp-table-entry-flags> 
</arp-table-entry> 
<arp-table-entry> 
<mac-address> 
00:0f:bb:c6:26:3d 
</mac-address> 
<ip-address> 
10.69.119.150 
</ip-address> 
<hostname> 
10.69.119.150 
</hostname> 
<interface-name> 
vlan.55 
</interface-name> 
<arp-table-entry-flags> 
<none/> 
</arp-table-entry-flags> 
</arp-table-entry> 
</arp-table-information>""" 

root = etree.fromstring(xml) 
result = root.xpath("descendant::mac-address[following-sibling::ip-address[normalize-space()='10.69.119.150']]") 
for r in result: 
    print(etree.tostring(r)) 

выход:

<mac-address> 
00:0f:bb:c6:26:3d 
</mac-address> 
+0

Большое спасибо. Ваше решение работает. –

Смежные вопросы