2012-11-05 42 views
1

我的XML:通過一個XML遍歷沒有在Python工作

<animals> 
    <animal name="fox" fullname="fullfox"></animal> 
    <animal name="dog" fullname="halfdog"><food>milk</food><food>rice</food><food>meat</food> </animal> 
    <animal name="cow" fullname="doublecow"><food>grass</food></animal> 
    <animal name="blabla" fullname="fullbla"></animal> 
</animals> 

我試圖解析這個XML得到相同的XML作爲輸出。

doc = ET.parse("an.xml") 
root = doc.getroot() #Returns the root element for this tree. 
root_new = ET.Element("animals") 
for child in root: 
    name = child.attrib['name'] 
    fullname = child.attrib['fullname'] 

for g in root.findall("*/food"): 
    animal = ET.SubElement(root_new, "animal") 
    food  = ET.SubElement(animal, "food") 
    food.text = g.text 
    animal.set("name",name)    
    animal.set("fullname",fullname) 

tree = ET.ElementTree(root_new) 
tree.write(sys.stdout) 

,但我只得到了最後一個值

<animals> 
    <animal fullname="fullbla" name="blabla"><food>milk</food></animal> 
    <animal fullname="fullbla" name="blabla"><food>rice</food></animal> 
    <animal fullname="fullbla" name="blabla"><food>meat</food></animal> 
    <animal fullname="fullbla" name="blabla"><food>grass</food></animal> 
</animals> 

和食品節點也錯了,如何遍歷酷似我的輸入XML?

+0

你應該是一個對象的兒童組在一起'food'標籤。嘗試迭代動物,併爲每個動物迭代食物。 – Bakuriu

+0

我嘗試這種方式tooo..but同樣:( –

+0

但沒有人能夠完全回答,輸出xml indendation :(,所有xml在這裏,我接受也在一行:( –

回答

2

你的代碼看起來應該是這樣

doc = ET.parse("test.xml") 
root = doc.getroot() #Returns the root element for this tree. 
root_new = ET.Element("animals") 
for child in root: 
    name    = child.attrib['name'] 
    fullname   = child.attrib['fullname'] 
    animal = ET.SubElement(root_new, "animal") 
    animal.set("name",name)    
    animal.set("fullname",fullname) 

    for g in child.findall("food"): 
     food = ET.SubElement(animal, "food") 
     food.text = g.text 

tree = ET.ElementTree(root_new) 
tree.write(sys.stdout) 
+0

這是我想要的東西:) –

+0

我很高興它幫助你。 – kalyan

1

有兩個問題。首先是你的縮進 - 我認爲這些是爲了嵌套循環。第二個問題是,你正在使用root.findall,這意味着你得到所有food項目,不管他們是在哪個節點試試這個:

... 
for child in root: 
    name = child.attrib['name'] 
    fullname = child.attrib['fullname'] 
    animal = ET.SubElement(root_new, 'animal') 
    for g in child.findall("food"): 
     food = ET.SubElement(animal, "food") 
     food.text = g.text 
     animal.set('name', name)    
     animal.set('fullname', fullname) 
+0

動物應創建之前的子循環 – jfs

+0

輸出只是這個,你怎麼說它的工作:) :

+0

是的,我會更新答案 – aquavitae

2

你需要一個嵌套的循環:

for child in root: 
    name    = child.attrib['name'] 
    fullname   = child.attrib['fullname'] 
    # create "animal" here 
    animal = ET.SubElement(root_new, "animal") 
    animal.set("name",name)    
    animal.set("fullname",fullname) 
    for g in child.findall("food"): 
     # create "food" here 
     food  = ET.SubElement(animal, "food") 
     food.text = g.text 
+0

爲-----在根:)它給我的語法錯誤 –

+0

:這是出來...嗯錯了一個兄弟:( –

+0

糾正了一些錯別字,應該罰款:) – light