0
<person>
<user name="david" password="super"><groups>meganfox</groups></user>
<user name="alen" password="boss"><groups>marvik</groups></user>
</person>

"groups" のテキスト値を取得するのが好きです。しかし、常にNoneになります。

import xml.etree.ElementTree as ET

doc    = ET.parse("users.xml")
root = doc.getroot() #Returns the root element for this tree.
root_new  = ET.Element("person") 
for child in root:
    name                = child.attrib['name']
    password             = child.attrib['password']
for groups in child.findall('groups'): #this is not working for me :(
    gpvalue =  groups.text 

    user  = ET.SubElement(root_new, "user") # create subelement in cycle! 
    group = ET.SubElement(user, "groups")
    user.set("name",name)               
    user.set("password",password) 
    group.text = gpvalue

tree = ET.ElementTree(root_new)
tree.write("new.xml")

import sys
tree.write(sys.stdout)

出力が得られます:(

<person>
    <user name="david" password="super"></groups></user>
    <user name="alen" password="boss"></groups></user>
  </person>

グループのテキスト値はありません。閉じたグループのみを印刷します。出力を確認してください

4

3 に答える 3

2

1) から までのブロック全体をもう 1 レベル インデントfor groupsするuser.set("password"必要があります。Python の制御フローはインデントがすべてであるため、最初のループ内に移動します。

2) 新しいファイルにグループを保存しようとしていますか? グループの値を取得したら、何もしません。

于 2012-11-05T05:19:13.953 に答える
1

2 番目の for ループで置き換えchild.てください! root.これでできるはずです!

または、もう一度見たところ、ネストされたループを作成したかったように見えますが、コードが適切にインデントされていません! ;-)

于 2012-11-05T05:13:14.077 に答える
1

ユーザーを経由せずに値を取得したい場合groupsは、パスを使用できます。

>>> root.findall("user")
[<Element 'user' at 0x1004d9f90>, <Element 'user' at 0x1004df0d0>]
>>> root.findall("groups")
[]
>>> root.findall("*/groups")
[<Element 'groups' at 0x1004d9fd0>, <Element 'groups' at 0x1004df190>]
>>> [g.text for g in root.findall("*/groups")]
['meganfox', 'marvik']

しかし、ループは私にとってはうまくいくようです:

>>> for child in root:
...     print child.attrib['name'], child.attrib['password'], 
...     for groups in child.findall("groups"):
...         print groups.text,
...     print
... 
david super meganfox
alen boss marvik
于 2012-11-05T05:15:39.250 に答える