Обработка Python XML после конкретного комментария - PullRequest
0 голосов
/ 04 января 2012

У меня есть автоматизированный процесс, который обновляет файл 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 Ответ

3 голосов
/ 04 января 2012

В 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
...