是否可以使用python按字母顺序对xml属性值进行排序?

时间:2020-02-06 06:54:59

标签: python xml sorting

我有一个类似的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>

2 个答案:

答案 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>
  1. 使用ElementTree加载数据。
  2. 收集标记名称值。
  3. 排序值。
  4. 更新标签名称值。
  5. 将更新的数据保存到新的xml文件中。
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>