2016-04-20 2 views
1

Ich habe eine XML-Dump-Datei, die ich für das erste Auftreten von "ETH0_IP" analysieren möchte. Das cdata-Feld wirft mich jedoch. Es endet mit der Rückgabe von "None". Es gibt andere IPs, die weiter in der Datei erscheinen, aber das interessiert mich nicht.Python XML Grab IP aus Datei zwischen CDATA

ich so etwas wie dies habe bisher:

q = etree.parse(outputfile) 
    fileoutputip = q.findtext("ETH0_IP") 

Dies ist der XML:

<VM> 
    <ID>####</ID> 
    <UID>0</UID> 
    <GID>0</GID> 
    <UNAME>####</UNAME> 
    <GNAME>###</GNAME> 
    <NAME>###</NAME> 
    <PERMISSIONS> 
    <OWNER_U>1</OWNER_U> 
    <OWNER_M>1</OWNER_M> 
    <OWNER_A>0</OWNER_A> 
    <GROUP_U>0</GROUP_U> 
    <GROUP_M>0</GROUP_M> 
    <GROUP_A>0</GROUP_A> 
    <OTHER_U>0</OTHER_U> 
    <OTHER_M>0</OTHER_M> 
    <OTHER_A>0</OTHER_A> 
    </PERMISSIONS> 
    <LAST_POLL>1461191030</LAST_POLL> 
    <STATE>3</STATE> 
    <LCM_STATE>3</LCM_STATE> 
    <PREV_STATE>3</PREV_STATE> 
    <PREV_LCM_STATE>3</PREV_LCM_STATE> 
    <RESCHED>0</RESCHED> 
    <STIME>1461189864</STIME> 
    <ETIME>0</ETIME> 
    <DEPLOY_ID>###</DEPLOY_ID> 
    <MEMORY>###</MEMORY> 
    <CPU>0</CPU> 
    <NET_TX>1000</NET_TX> 
    <NET_RX>73254</NET_RX> 
    <TEMPLATE> 
    <AUTOMATIC_REQUIREMENTS><![CDATA[!(PUBLIC_CLOUD = YES)]]></AUTOMATIC_REQUIREMENTS> 
    <CONTEXT> 
     <DISK_ID><![CDATA[1]]></DISK_ID> 
     <ETH0_DNS><![CDATA[####]]></ETH0_DNS> 
     <ETH0_GATEWAY><![CDATA[###]]></ETH0_GATEWAY> 
     <ETH0_IP><![CDATA[10.**.***.**]]></ETH0_IP> 

Antwort

1

q.findtext("ETH0_IP") würde versuchen ETH0_IP Elemente zu finden direkt unter dem Root-Elemente im Baum und in In diesem Fall ergibt es None seit VM hat keine direkte ETH0_IP Kind.

Sie es Ausdruck, indem der XPath lösen können (für das ETH0_IP Element überall in dem Baum zu sehen) zu find() oder findtext() oder xpath() Verfahren direkt über:

>>> from lxml import etree 
>>> 
>>> tree = etree.parse("input.xml") 
>>> print(tree.find(".//ETH0_IP").text) 
10.**.***.** 
>>> print(tree.findtext(".//ETH0_IP")) 
10.**.***.** 
>>> print(tree.xpath("//ETH0_IP")[0].text) 
10.**.***.** 
+0

Ah, die alle Unterschiede gemacht , Danke! – Publiccert

+1

@Publiccert Gern geschehen. Ich habe auch etwas mehr relevante Informationen zu der Antwort hinzugefügt, schau es dir an. – alecxe