Можно ли отсортировать значения атрибута xml в алфавитном порядке, используя python? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть аналогичный 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>

Я хочу вывод xml файл должен быть:

<x name = something>
  <a name = AAA> </a>
  <a name = BBB> </a>
  <a name = CCC> </a>
</x>
<x name = random>
  <a name = AAA> </a>
  <a name = BBB> </a>
  <a name = CCC> </a>
</x>

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Возможно, это то, что вам нужно.

Я добавил пример документа в исходный код, но вы можете загрузить 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 применяется только в том случае, если все дочерние элементы узла являются a узлами.)

0 голосов
/ 06 февраля 2020

Для .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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...