【问题标题】:How to convert xml tags into dictionary using python?如何使用python将xml标签转换为字典?
【发布时间】:2018-12-27 09:17:14
【问题描述】:

我正在尝试使用 python 在字典中添加元素来保存键值对。我的输入是 xml,预期的输出应该是字典。

输入:-

<math>
    <elements>
        <function>
           <val>ADD</val>
        </function>
        <operator>
           <val>+</val>
        </operator>
        <function>
           <val>SUB</val>
        </function>
        <operator>
           <val>-</val>
        </operator>
    </elements>
</math>

我尝试解析并将其转换为字典,但没有帮助。我正在使用 lxml,不想使用 xmltodict。

code till now:- 

from lxml import etree
from lxml.etree import _ElementTree, _Element, XMLParser
tree = etree.parsexml('math.xml')
root = tree.getroot()
mathdict = {}

for item in root.findall('./math/elements/function/'):
    for d in root.findall('./math/elements/operator/'):
        mathdict[item.text] = d.text

它应该返回如下字典:- [添加:+,SUB:-]

【问题讨论】:

  • @amrit 我已经检查了上面的链接,但它没有解决我正在寻找的东西我想要一个用于两个孩子的递归函数,他们之间一个是价值,另一个是关键。

标签: python-3.x


【解决方案1】:

假设 XML 的顺序总是“正确的”,你可以使用.iterzip

import xml.etree.ElementTree as ET


string = '''<math>
                <elements>
                    <function>
                       <val>ADD</val>
                    </function>
                    <operator>
                       <val>+</val>
                    </operator>
                    <function>
                       <val>SUB</val>
                    </function>
                    <operator>
                           <val>-</val>
                    </operator>
                </elements>
            </math>'''

root = ET.fromstring(string)

output = {}

functions, operators = root.iter('function'), root.iter('operator')

for function, operator in zip(functions, operators):
    output[function.find('val').text] = operator.find('val').text

print(output)
# {'ADD': '+', 'SUB': '-'}

字典的创建和循环可以浓缩为一个字典理解:

output = {function.find('val').text: operator.find('val').text
          for function, operator in zip(functions, operators)}

【讨论】:

  • 这是一个很好的答案,但是如果这个 xml 有另一个具有相同标签的标签,比如 .... 怎么办?
  • @Pyjava 那么这个答案可以很容易地修改。我在示例中使用 XML 进行了回答
  • 知道了,谢谢。我想出了一个办法。
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多