1

私のXML:

<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 とまったく同じように反復するにはどうすればよいですか?

4

3 に答える 3

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 
于 2012-11-05T08:25:56.753 に答える
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)
于 2012-11-05T08:27:24.677 に答える
1

2 つの問題があります。1 つ目はインデントです。これらはネストされたループを意図していると思います。2 番目の問題は、 を使用していることです。これは、アイテムがどのノードにあるかに関係なく、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) 
于 2012-11-05T08:22:55.107 に答える