Python 从XML解析名称/值对

Python 从XML解析名称/值对,python,xml,python-3.x,Python,Xml,Python 3.x,我试图从供应商提供的XML文件中提取帐户详细信息 我有一个供应商提供了如下XML文件: 1234567 $200.00 ... 我可以使用python非常轻松地解析它: mytree=et.parse(xml\u路径) myroot=mytree.getroot() 对于费用中的acc_root.findall(“账户”): acctnum=acc.find('AccountNumber')。文本 balance=acc.find('balance')。文本 打印(账户、余额) 哪些输出是

我试图从供应商提供的XML文件中提取帐户详细信息

我有一个供应商提供了如下XML文件:


1234567
$200.00
...
我可以使用python非常轻松地解析它:

mytree=et.parse(xml\u路径)
myroot=mytree.getroot()
对于费用中的acc_root.findall(“账户”):
acctnum=acc.find('AccountNumber')。文本
balance=acc.find('balance')。文本
打印(账户、余额)
哪些输出是这样的:

1234567 $200.00
但是,另一家供应商提供的XML文件更像是名称/值对,我不确定如何轻松访问该数据。它的工作方式与上述不同:


...
到目前为止,我已经得到了这个,但我希望能够单独轻松地访问这些值:

mytree=et.parse(xml\u路径)
myroot=mytree.getroot()
对于myroot.findall(“帐户”)中的字段:
对于字段中的行:
打印(line.attrib)
其输出类似于:

{'name': 'AccountNumber', 'value': '1234567'}
{'name': 'Balance', 'value': '$200.00'}

所以我的问题是-我如何访问这些值并将它们分配给变量(基于
名称
),以便在脚本中的其他地方使用它们,就像我在第一个示例中使用
acctnum
balance
一样?

填充一个新的数据结构(如
dict
)当您迭代而不是仅仅放弃时,从
字段中:

account_d = {}
for field in myroot.findall('Account'):
    for line in field:
        account_d[line.attrib['name']] = line.attrib['value']

    # account_d should now be:
    # { 'AccountNumber': '1234567', 'Balance': '$200.00' }
您也可以使用列表/元组列表:

account_a = []
for field in myroot.findall('Account'):
    for line in field:
        account_d.append(line.attrib['name'], line.attrib['value']) 

    # account_a should now be:
    # [('AccountNumber', '1234567'), ('Balance', '$200.00')]

ElementTree 1.3能够定位具有特定属性的节点:

from xml.etree import ElementTree as et

data = '''\
<Accounts>
  <Account>
    <field name='AccountNumber' value='1234567' />
    <field name='Balance' value='$200.00' />
  </Account>
  <Account>
    <field name='AccountNumber' value='9999999' />
    <field name='Balance' value='$300.00' />
  </Account>
</Accounts>'''

tree = et.fromstring(data)

for acc in tree.iterfind('Account'):
    acctnum = acc.find("field[@name='AccountNumber']").attrib['value']
    balance = acc.find("field[@name='Balance']").attrib['value']
    print(acctnum,balance)

您可以通过将所有
帐户
元素的
字段
属性收集到字典中,然后根据需要使用其中的信息来完成:

accounts.xml
示例输入文件:


代码:

结果:

1234567$200.00
8901234 $100.00
问题:如何访问值并将其分配给变量(基于名称)

将所有帐户转换为Dict[字段]的Dict[帐户编号]。
属性
name
成为
dict
键:

Accounts = {}
for account in root.findall('Account'):
    fields = {}
    for field in account.findall('field'):
        fields[field.attrib['name']] = field.attrib['value']

    print('{a[AccountNumber]} {a[Balance]}'.format(a=fields))
    Accounts[fields['AccountNumber']] = fields

print(Accounts)
输出

1234567 $200.00
9999999 $300.00
{'9999999': {'AccountNumber': '9999999', 'Balance': '$300.00'}, '1234567': {'AccountNumber': '1234567', 'Balance': '$200.00'}}
使用Python:3.4.2测试

Accounts = {}
for account in root.findall('Account'):
    fields = {}
    for field in account.findall('field'):
        fields[field.attrib['name']] = field.attrib['value']

    print('{a[AccountNumber]} {a[Balance]}'.format(a=fields))
    Accounts[fields['AccountNumber']] = fields

print(Accounts)
1234567 $200.00
9999999 $300.00
{'9999999': {'AccountNumber': '9999999', 'Balance': '$300.00'}, '1234567': {'AccountNumber': '1234567', 'Balance': '$200.00'}}