Обработка 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