2

我有以下 test.xml

<root>
<parent>
    <ID>1</ID>
    <child1>Value1</child1>
    <child2>value11</child2>
    <child3>
       <subchild>value111</subchild>
    </child3>
</parent>
<parent>
    <ID>2</ID>
    <child1>value2</child1>
    <child2>value22</child2>
    <child2>value333</child2>
</parent>
<parent>
    <ID>3</ID>
    <child1>value3</child1>
    <child2>value33</child2>
</parent>
<parent>
    <ID>4</ID>
    <child1>value4</child1>
    <child2>value44</child2>
</parent>
</root>

我想要完成的是以下内容:我想遍历 test.xml 并且对于每个父节点,我想将所有子节点放在一个字典中,其中标签是索引,文本是值,一旦我得到到父级的末尾将其添加到数据库并重置字典并移动到下一个父级。

所以对于我想要的第一个父母

    insert = {'ID':1,'child1':'value1','child2':'value11','subchild':'value111'}

在 SQL 查询中使用它,然后移动到下一个父级重置字典并执行相同的操作。并非每个父母都有相同数量的孩子,有些孩子有子孩子。

我尝试过:

    value = []
    tag = []

    from elementtree import ElementTree as ET
    for parent in tree.getiterator():
        for child in parent:
             value.append(child.text)
             tag.append(child.tag)

但我无法弄清楚如何获得我想要的结果。为了使帖子尽可能简单,我省略了检索和打开 xml。这是我尝试使用的方法,但我认为它不正确,因为我无法在父标记末尾停止迭代以插入。

任何帮助将不胜感激!谢谢

4

2 回答 2

2

使用lxml库试试这个:

from lxml import etree

source = """
<root>
<parent>
    <ID>1</ID>
    <child1>Value1</child1>
    <child2>value11</child2>
    <child3>
       <subchild>value111</subchild>
    </child3>
</parent>
<parent>
    <ID>2</ID>
    <child1>value2</child1>
    <child2>value22</child2>
    <child2>value333</child2>
</parent>
<parent>
    <ID>3</ID>
    <child1>value3</child1>
    <child2>value33</child2>
</parent>
<parent>
    <ID>4</ID>
    <child1>value4</child1>
    <child2>value44</child2>
</parent>
</root>
"""

document = etree.fromstring(source)
inserts = []

id_number = 3

for parent in document.findall('parent'):
    insert = {}
    cont = 0
    for element in parent.iterdescendants():
        if element.tag == 'ID':
            if element.text == str(id_number):
                cont = 1
        if element.getchildren() == []:
            insert[element.tag] = element.text
    if cont:
        inserts.append(insert)

print inserts
于 2012-04-12T18:23:07.007 回答
0

python 还附带了一个 etree API(它没有漂亮的打印和 lxml 具有的一些其他功能):http ://docs.python.org/library/xml.etree.elementtree.html

于 2012-04-12T18:50:32.877 回答