2012-01-04 59 views
0

我有一個自動化的進程,保持一個XML文件最新的基礎上一個外部的數據源。這個XML文件也可以由用戶修改,其手動修改需要維護。Python 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: 
    ..... 

我怎樣纔開始遇到我的意見後找節點?

回答

2

在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