我有一个类似的xml文件,在该文件中,我想按字母顺序对标签的属性值进行排序。
value.BrowseNodeInfo.BrowseNodes[0].SalesRank
我希望输出的xml文件为:
<x name = something>
<a name = BBB> </a>
<a name = AAA> </a>
<a name = CCC> </a>
</x>
<x name = random>
<a name = CCC> </a>
<a name = BBB> </a>
<a name = AAA> </a>
</x>
答案 0 :(得分:0)
类似的东西也许就是您想要的。
我已经在源代码中嵌入了一个示例文档,但是您可以从磁盘或任何需要的位置加载XML。
这个想法是拥有一个具有任意条件(谓词)功能和一个sort
键功能的递归功能;这样,您可以选择应该对哪些树进行重新排序–或者,如果您只想对所有树进行重新排序,则它可以是始终返回True的函数。
import xml.etree.ElementTree as etree
def sort_tree(node, sort_cond, sort_key):
# If this node matches the condition,
if sort_cond(node):
# ... sort the children and reapply into the node.
node[:] = sorted(node, key=sort_key)
# Recurse down the tree.
for child in node:
sort_tree(child, sort_cond, sort_key)
tree = etree.XML("""
<document>
<x name="xxsomething">
<a name="BBB">some thing bbb</a>
<a name="AAA">aaa some thing</a>
<a name="CCC">some ccc thing</a>
</x>
<x name="aarandom">
<a name="ZXY">asdf</a>
<a name="888">ghkj</a>
<a name="uuu">tyiu</a>
</x>
</document>
""")
sort_tree(
tree,
sort_cond=lambda node: all(child.tag == "a" for child in node),
sort_key=lambda node: node.get("name"),
)
print(etree.tostring(tree, encoding='unicode'))
输出:
<document>
<x name="xxsomething">
<a name="AAA">aaa some thing</a>
<a name="BBB">some thing bbb</a>
<a name="CCC">some ccc thing</a>
</x>
<x name="aarandom">
<a name="888">ghkj</a>
<a name="ZXY">asdf</a>
<a name="uuu">tyiu</a>
</x>
</document>
(请注意,即使x
标签的“名称”顺序错误,也不会重新排序,因为cond
函数仅在节点的所有子节点均为{{1}时才适用}节点。)
答案 1 :(得分:-1)
对于.xml
文件,例如:
<x name='random'>
<a name='CCC'> </a>
<a name='BBB'> </a>
<a name='AAA'> </a>
</x>
ElementTree
加载数据。 import xml.etree.ElementTree
# open file
root = xml.etree.ElementTree.parse('data.xml')
# collect tag names values
names = []
for element in root.findall('a'):
value = element.attrib.get('name')
names.append(value)
# sort values
sorted_names = sorted(names)
# update data
count = 0
for element in root.findall('a'):
value = element.attrib.get('name')
element.attrib['name'] = sorted_names[count]
count +=1
# save new data
root.write('new.xml')
输出:
<x name="random">
<a name="AAA"> </a>
<a name="BBB"> </a>
<a name="CCC"> </a>
</x>