2015-03-27 11 views
5

Diese meine XML-DatenWie alle untergeordneten Knoten in einer einzigen Abfrage mit lxml & XPATH abrufen

ist
<location> 
    <city> 
     <name> New York</name> 
     <type>non-capital</type> 
    </city> 

    <city> 
     <name> London</name> 
     <type>capital</type> 
    </city> 
</location> 

lxml & Python

from lxml import etree as ET 

parser = ET.XMLParser(recover=True) 

tree = ET.fromstring(xml_data,parser) 
print(tree.xpath('//city//name/text() | //city//type/text()')) 

Der obige Code funktioniert mit, aber ich möchte ein geschachtelte Array-Beschreibung als [['New York','non-capital'],['London','capital']]

Was wäre die genaue xpath Abfrage/Kombination von Abfragen/Schleifen, um das oben genannte zu erhalten?

Antwort

5

Dies ist eine mögliche Art und Weise:

....... 
result = [] 
for city in tree.xpath('//city'): 
    result.append([city.find('name').text, city.find('type').text]) 

print(result) 
# output : 
#[[' New York', 'non-capital'], [' London', 'capital']] 
2

Liste Verständnis Lösung:

xml_data='''<location> 
    <city> 
     <name> New York</name> 
     <type>non-capital</type> 
    </city> 
    <city> 
     <name> London</name> 
     <type>capital</type> 
    </city> 
</location>''' 

from lxml import etree as ET 

parser = ET.XMLParser(recover=True) 

tree = ET.fromstring(xml_data,parser) 
print(tree.xpath('//city')) 


cities = [[c.text for c in n if c.tail] for n in tree.xpath('//city')] 

Ergebnisse in:

[[' New York', 'non-capital'], [' London', 'capital']] 
+0

'[[c.text für c in n] für n in tree.xpath ('// city')] 'funktioniert gut, was macht c.tail? – wolfgang

+0

Es ist nur meine Gewohnheit, die ich habe, aber in Ihrem Fall nicht benötigt. Lxml kann normalen Text und so genannten Tail-Text haben. Mehr [hier] (http://lxml.de/tutorial.html) – Marcin

+0

Behalten Sie diesen Fehler-ValueError: Unicode-Strings mit Encoding-Deklaration werden nicht unterstützt. Bitte verwenden Sie eine Byte-Eingabe oder XML-Fragmente ohne Deklaration. –

Verwandte Themen