2012-11-05 4 views
1

내 XML을 작동하지 않습니다.은 Python으로

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

처럼 보일 것입니다. 동물을 반복하고 각 동물은 음식을 반복합니다. – Bakuriu

+0

나는 그런 식으로 tooo .. 그러나 똑같이해라. ( –

+0

그러나 아무도 정확하게 대답 할 수 없다, 출력 xml indendation :(나는 모든 XML을 여기에서 받아 들였다. 나는 한 줄로도 받아 들였다 : ( –

답변

2

코드는 사용자가 객체의 자식 그룹 함께`food` 태그를해야이

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

두 가지 문제점이 있습니다. 첫 번째는 들여 쓰기입니다.이 루프는 중첩 된 루프로 간주됩니다. 두 번째 문제는 당신이 상관없이에있는 노드의 모든 food 항목을 받고 있음을 의미한다 root.findall을 사용하고 있다는 것입니다 대신을 시도해보십시오.

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 
:
... 
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

당신은 중첩 루프를 필요
+0

으로 업데이트합니다. 구문 오류가 발생했습니다. –

+0

<동물의 이름 = "fullfox "동물의 fullname" "fullbla"name = "blabla"/><동물의 전체 이름 = "개" : 이것은 밖으로 넣어입니다 ... 흠 잘못된 한 형제 : ( –

+0

일부 오타 수정, 이제 괜찮을거야 :) – light