Обработка Python XML после определенного комментария

У меня есть автоматизированный процесс, который поддерживает XML-файл в актуальном состоянии на основе внешнего источника данных. Этот XML-файл также может быть изменен пользователями, их ручные изменения должны быть сохранены.

<Nodes>
    <!-- User added data goes here -->
    <Node name="1">Data Data Data</Node>
    <Node name="2">Data Data Data</Node>
    <Node name="3">Data Data Data</Node>

    <!-- AUTOMATEDSTUFF -->
    <!-- User, do not modify nodes below this line. -->
    <Node name="4">Data Data Data</Node>
    <Node name="5">Data Data Data</Node>
    <Node name="6">Data Data Data</Node>

</Nodes>

При каждом обновлении файла я хочу удалить все узлы, ранее добавленные моей автоматикой. Это все, что ниже:

<!-- AUTOMATEDSTUFF --> 

Прямо сейчас я читаю все узлы в Python следующим образом:

xmldoc = minidom.parse(filename)
nodesSection = xmldoc.getElementsByTagName('Nodes')[0]
for child in nodesSection.childNodes:
    .....

Как мне начать искать узлы только после того, как я увижу мой комментарий?

1 ответ

Решение

В XML комментарии являются комментариями и могут быть по праву удалены из документа на любом этапе обработки. Вы должны адаптировать свою программу, чтобы добавить специальный атрибут, такой как

<Nodes>
    <!-- User added data goes here -->
    <Node name="1">Data Data Data</Node>
    <Node name="2">Data Data Data</Node>
    <Node name="3">Data Data Data</Node>

    <!-- User, do not modify nodes below this line. -->
    <Node name="4" from="autogenerated">Data Data Data</Node>
    <Node name="5" from="autogenerated">Data Data Data</Node>
    <Node name="6" from="autogenerated">Data Data Data</Node>
</Nodes>

Затем вы можете просто отфильтровать все узлы с помощью свойства from="autogenerated",


Однако, если вы действительно хотите обнаружить комментарии (и, как уже упоминалось выше, это плохая идея), просто проверьте все дочерние элементы <Node>:

xmldoc = minidom.parse(filename)
nodes = xmldoc.documentElement.childNodes
commentIdx = next(i for i,n in enumerate(nodes) if
                n.nodeType == n.COMMENT_ELEMENT and n.data == ' AUTOMATEDSTUFF ')
automatedNodes = nodes[commentIdx+1:]
print(automatedNodes) # or do something else with them
Другие вопросы по тегам