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

尝试改变它:

if elem1.tag == 'Components':
    temp = 0
    for elem2 in list(elem1):
        if elem2.tag == 'Component':
            for elem3 in list(elem2):
                if elem3.tag == 'ComponentID':
                    asset['CompID'+str(temp)] = elem3.text
                if elem3.tag == 'ComponentName':
                    asset['CompName'+str(temp)] = elem3.text
                if elem3.tag == 'Description':
                    asset['Description'+str(temp)] = elem3.text
            temp+=1
于 2012-12-11T15:04:08.150 回答
0

以下是一些可能对您有所帮助的提示:

  • 使用enumerate为您计算<Component>元素。
  • 使用dict 在标签(例如)和所需的结果键(例如)keyname之间进行映射ComponentIDCompID

例如,使用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 回答