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 に答える