2011-08-09 64 views
0

的childNodes我很新的XML值。我正在嘗試從的childNodes檢索與minidom命名

from xml.dom import minidom 

def Get_ExtList(progName): 
    progFile='%s.xml'%progName 
    xmldoc = minidom.parse(progFile) 
    extList=[] 
    rootNode=xmldoc.firstChild 
    progNode=rootNode.childNodes[1] 
    for fileNodes in progNode.childNodes: 
     newList=[]  
     for formatNodes in fileNodes.childNodes:   
      for nodes in formatNodes.childNodes: 
       x=nodes.toxml() 
       x=' '.join(x.split()) 
       newList.append(str(x)) 
     extList.append(newList)  
    print extList 

輸出:

[[], [‘.aaa'], [], [‘.bbb'], [], [‘.ccc'], [], [‘.ddd'], [], [‘.xxx', ‘.yyy'], []] 

,但我想要的東西如下

[[‘.aaa'], [‘.bbb'],[‘.ccc’],[‘.ddd'],[‘.xxx', ‘.yyy']] 

以下是樣本文件:

<?xml version="1.0" ?> 
<program> 
    <progname name="TEST"> 
    <file> 
     <format> 
     .aaa 
     </format> 
    </file> 
    <file> 
     <format> 
     .bbb 
     </format> 
    </file> 
    <file> 
     <format> 
     .ccc 
     </format> 
    </file> 
    <file> 
     <format> 
     .ddd 
     </format> 
    </file> 
    <file> 
     <format> 
     .xxx 
     </format> 
     <format> 
     .yyy 
     </format> 
    </file> 
    </progname> 
</program> 

回答

0

DOM節點可以是元素,文本甚至註釋。另請注意,不應使用toxml來提取文本內容。相反,使用文本節點的.data屬性:

for nodes in formatNodes.childNodes: 
    if node.nodeType == node.ELEMENT_NODE: 
     tns =(tn.data for tn in node.childNodes if tn.nodeType == node.TEXT_NODE) 
     newList.append(''.join(tns).strip()) 
+0

我已經能夠通過修改運行代碼,但修剪功能不起作用。它給出了以下錯誤AttributeError:'unicode'對象沒有'trim'屬性所以我必須使用split來使它工作。上面的代碼看起來非常整齊,但是如果我能使它工作。有什麼建議麼? – shash

+0

@shabana糟糕,用'strip'把'trim'搞糊塗了。現在應該修復。 – phihag

0

在這種情況下,你可以嘗試處理列表並刪除空元素:

>>> list = [[], ['.inp'], [], ['.mdp'], [], ['.xtc'], [], ['.top'], [], ['.gro', '.pdb'], []] 
>>> for i in list: 
... if not i: 
...  list.remove(i) 
... 
>>> list 
[['.inp'], ['.mdp'], ['.xtc'], ['.top'], ['.gro', '.pdb']] 
+0

我一直在做。但我相信應該有更好的方法來提取節點值。我覺得我的方法並不是最好的,而我在XML格式方面知之甚少。 – shash

1

您只能通過包含<file>標籤節點循環不(ELEMENT_NODE節點類型),而且還有縮進空格(TEXT_NODE節點類型)。例如,在此元件:

<a> 
    <b>c</b> 
</a> 

有三個要素:

  • TEXT_NODE與值\n__(與_表示空格)
  • ELEMENT_NODE與值<b>c</b>
  • TEXT_NODE與值\n

如果該文件的格式不同:<a><b>c</b></a>裏面只有一個ELEMENT_NODE

例如,您可以跳過這些節點:

for fileNodes in progNode.childNodes:  
    if fileNodes.nodeType != fileNodes.ELEMENT_NODE:  
     continue 

或請檢查是否newList爲正確的節點被創建並添加它的內容只爲ELEMENT_NODE

if fileNodes.nodeType == fileNodes.ELEMENT_NODE:  
     extList.append(newList)   

否則你會得到空列表[]追加。