0

質問があいまいな場合は申し訳ありませんが、この例の xml はそれを完全に示しています。

<Components>
    <Component>
        <ComponentID>B1</ComponentID>
        <ComponentName>replace</ComponentName>
        <Description>replace</Description>
    </Component>
    <Component>
        <ComponentID>D2</ComponentID>
        <ComponentName>Red</ComponentName>
        <Description>Red</Description>
    </Component>
    <Component>
        <ComponentID>D3</ComponentID>
        <ComponentName>Yellow</ComponentName>
        <Description>Yellow</Description>
    </Component>
</Components>

基本的に、これらの各コンポーネントを辞書に保存したいと考えています。私はこのコードを試しました:

if elem1.tag == 'Components':
    for elem2 in list(elem1):
        if elem2.tag == 'Component':
            temp = 0
            for elem3 in list(elem2):
                if elem3.tag == 'ComponentID':
                    temp+=1
                    asset['CompID'+str(temp)] = elem3.text
            for elem3 in list(elem2):
                if elem3.tag == 'ComponentName':
                    temp+=1
                    asset['CompName'+str(temp)] = elem3.text
            for elem3 in list(elem2):
                if elem3.tag == 'Description':
                    temp+=1
                    asset['Description'+str(temp)] = elem3.text

しかし、発生する問題は、各ディクショナリ キーが一意であっても、情報が取得されるのは最後に見つかったコンポーネントだけであるということです。

現在の出力:

{'CompID1': 'D3', 'CompName2': 'Yellow', 'Description3': 'Yellow'}

望ましい出力:

{'CompID1': 'B1', 'CompName1': 'replace', 'Description1': 'replace',
'CompID2': 'D2', 'CompName2': 'Red', 'Description2': 'Red',
'CompID3': 'D3', 'CompName3': 'Yellow', 'Description3': 'Yellow'}

一時呼び出しと割り当てが間違っている可能性があることはわかっていますが、最後のタグしか見つからないため、各タグ内のテキスト値の割り当てが主な問題です。最終的な解決策では、他のメソッドや関数で使用するために、最後に辞書が必要になります。そのため、ヒントや解決策は大歓迎ですが、辞書に焦点を当てることができれば、非常に役立ちます.

4

2 に答える 2

0

ここで役立つヒントをいくつか紹介します。

  • enumerateを使用して<Component>要素を数えます。
  • keynamedict を使用して、タグ (例: ComponentID) と目的の結果キー (例: )CompIDをマッピングします。

たとえば、次の設定でlxmlを使用します。

import lxml.etree as ET
import pprint

content = '''
<Components>
    <Component>
        <ComponentID>B1</ComponentID>
        <ComponentName>replace</ComponentName>
        <Description>replace</Description>
    </Component>
    <Component>
        <ComponentID>D2</ComponentID>
        <ComponentName>Red</ComponentName>
        <Description>Red</Description>
    </Component>
    <Component>
        <ComponentID>D3</ComponentID>
        <ComponentName>Yellow</ComponentName>
        <Description>Yellow</Description>
    </Component>
</Components>
'''

コード:

keyname = {'ComponentID' : 'CompID',
           'ComponentName': 'CompName'}
result = {}
doc = ET.fromstring(content)
for i, component in enumerate(doc.xpath('Component'), 1):
    for node in component:
        key = '{t}{i}'.format(t = keyname.get(node.tag, node.tag), i = i)
        result[key] = node.text
pprint.pprint(result)        

収量

{'CompID1': 'B1',
 'CompID2': 'D2',
 'CompID3': 'D3',
 'CompName1': 'replace',
 'CompName2': 'Red',
 'CompName3': 'Yellow',
 'Description1': 'replace',
 'Description2': 'Red',
 'Description3': 'Yellow'}
于 2012-12-11T15:08:31.627 に答える