xml - 根据python中的属性对xml进行排序
问题描述
我正在尝试根据字段标记中的代码对 xml 进行排序。
下面是我尝试的代码实现,但它只打印一个字段
排序应该主要在代码属性上进行
import xml.etree.ElementTree as ET
xmlData = '''<data>
<values>
<field code="6">rst</field>
<show>qwerty6</show>
<chip/>
<normal/>
</values>
<values>
<field code="5">opq</field>
<show>qwerty5</show>
<chip/>
<normal/>
</values>
<values>
<field code="4">klm</field>
<show>qwerty4</show>
</values>
<values>
<field code="3">hij</field>
<show>qwerty3</show>
<chip/>
<normal/>
</values>
<values>
<field code="2">efg</field>
<show>qwerty2</show>
<chip/>
<normal/>
</values>
<values>
<field code="1">abc</field>
<show>qwerty1</show>
</values>
</data>'''
tree = ET.fromstring(xmlData)
myvalues = tree.find('values')
for el in myvalues:
el[:] = sorted(el, key=lambda e: (e.tag, e.attrib['code']))
tree[:] = myvalues
xmlstr = ET.tostring(tree, encoding="utf-8", method="xml")
print(xmlstr.decode("utf-8"))
解决方案
您可以删除冗余循环并myvalues
直接传递给sorted
. 当您调用sorted
时,它将迭代data
Element
。
lambda
应该是这样的:
lambda value: value[0].get("code")
这将从 中获取第一个孩子 ( field
)values
并返回code
以用作排序键。
然后,您可以myvalues
直接从 XML 重新生成 - 无需将任何内容分配回tree
.
以下内容应该适合您:
import xml.etree.ElementTree as ET
xmlData = """
<data>
<values>
<field code="6">rst</field>
<show>qwerty6</show>
<chip/>
<normal/>
</values>
<values>
<field code="5">opq</field>
<show>qwerty5</show>
<chip/>
<normal/>
</values>
<values>
<field code="4">klm</field>
<show>qwerty4</show>
</values>
<values>
<field code="3">hij</field>
<show>qwerty3</show>
<chip/>
<normal/>
</values>
<values>
<field code="2">efg</field>
<show>qwerty2</show>
<chip/>
<normal/>
</values>
<values>
<field code="1">abc</field>
<show>qwerty1</show>
</values>
</data>
"""
tree = ET.ElementTree(ET.fromstring(xmlData))
myvalues = tree.getroot()
myvalues[:] = sorted(myvalues, key=lambda value: value[0].get("code"))
xmlstr = ET.tostring(myvalues, encoding="utf-8", method="xml")
print(xmlstr.decode("utf-8"))
这给出了输出:
<data>
<values>
<field code="1">abc</field>
<show>qwerty1</show>
</values>
<values>
<field code="2">efg</field>
<show>qwerty2</show>
<chip />
<normal />
</values>
<values>
<field code="3">hij</field>
<show>qwerty3</show>
<chip />
<normal />
</values>
<values>
<field code="4">klm</field>
<show>qwerty4</show>
</values>
<values>
<field code="5">opq</field>
<show>qwerty5</show>
<chip />
<normal />
</values>
<values>
<field code="6">rst</field>
<show>qwerty6</show>
<chip />
<normal />
</values>
</data>
推荐阅读
- reactjs - Does useCallback improve performance when rendering components inside a normal function?
- mongodb - MongoDB $lookup,按日期显示最大文档
- mongodb - MongoDB "Automatically disabling TLS 1.0, to force-enable TLS 1.0"
- javascript - redux 没有捕捉到错误
- android - 当我添加安全参数插件时,Gradle 同步失败
- python - 访问单个列表值的更好解决方案
- python - 如何在 seaborn FacetGrid 中格式化 y 轴或 x 轴标签
- google-apps-script - 谷歌 appscript 将工作表转换为 PDF
- javascript - 如何使用排序表达式对对象属性进行动态排序?
- perl - 如何使用 perl 和 sendmail 从 URL 发送 pdf [Mail::Sendmail]