在特定注释后处理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 个回答
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