2016-08-10 3 views
1

Ich habe die folgende XML-Datensatz:Python konvertieren xml zur Liste

<cnode desc="" name="xyz"> 
    <pnode name="word1"/> 
    <pnode name="word2"/> 
    <pnode name="word3"/> 
    ... 
<cnode desc="" name="abc"> 
    <pnode name="word4"/> 
    <pnode name="word5"/> 
    <pnode name="word6"/> 
    ... 

Ich möchte eine Liste aller Wörter nach dem name = ‚xyz‘ bekommen und ‚abc‘ bzw., z.B. xyz = [word1, word2, word3, ...] und abc = [Word4, word5, word6, ...]

ich die follwing Lösung versucht:

import xml.etree.ElementTree as etree 
xyz=[] 
abc=[] 

tree = etree.parse('data.xml') 
root = tree.getroot() 

for child in root: 
    words.append(child.findall(?!)) 
print(words) 

Aber ich kann nicht verstehen heraus, wie man sich auf den Elternteil mit name = xyz bezieht und dann die Wörter der Kinder extrahiert.

Danke für Ihre Hilfe !!

+0

aussieht wie du ein Wörterbuch von Listen benötigen: '{ 'xyz': [ 'word1', word2' , 'word3'], 'abc' : ['word4', word5 ',' word6 ']} 'Wären Sie in der Lage fortzufahren, wenn Sie diese Art von Objekt erhalten? – BusyAnt

Antwort

0

zunächst sollten Sie Ihre Demo xml reparieren es eine fehlende Nähe Zitat ist

würde ich XPath

from lxml import etree 

tree = etree.parse('data.xml') 
root = tree.getroot() 

xyzpnodes = root.xpath(".//cnode[@name='xyz']/pnode") 
xyz = [p.attrib["name"] for p in xyzpnodes] 

print xyz 
+0

Genau das habe ich versucht zu finden !! Vielen Dank! und ich habe die fehlenden Zitate eingefügt :) – Tessa

1

können Sie gehen für:

string = """ 
<nodes> 
    <cnode desc="" name="xyz"> 
     <pnode name="word1"/> 
     <pnode name="word2"/> 
     <pnode name="word3"/> 
    </cnode> 
    <cnode desc="" name="abc"> 
     <pnode name="word4"/> 
     <pnode name="word5"/> 
     <pnode name="word6"/> 
    </cnode> 
</nodes> 
""" 

import xml.etree.ElementTree as etree 
xyz=[] 
abc=[] 

tree = etree.fromstring(string) 

result = {} 
for node in tree.findall('cnode'): 
    name = node.get('name') 
    if name not in result.items(): 
     result[name] = [] 

    for child in node.findall('pnode'): 
     child_name = child.get('name') 
     result[name].append(child_name) 

print(result) 
# {'xyz': ['word1', 'word2', 'word3'], 'abc': ['word4', 'word5', 'word6']} 

Dieser durchquert den Baum und Kind Knoten und fügt die entsprechenden Werte zum dict result hinzu.
Es ist sogar möglich kürzer mit Hilfe von zip:

result = dict(zip((cnode.get('name') for cnode in tree.findall('cnode')), \ 
      [[pnode.get('name') for pnode in cnode.findall('pnode')] \ 
       for cnode in tree.findall('cnode')])) 
print(result)