在特定注释后处理Python XML

0 投票
1 回答
780 浏览
提问于 2025-04-17 09:33

我有一个自动化的流程,它会根据外部数据源不断更新一个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

在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

撰写回答