2011-08-09 9 views
0

과 childNodes에에서 값을 검색하고 나는 childNodes에내가 XML에 아주 새로운 오전 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을 사용하면 안됩니다. 당신이 빈 요소를 목록을 처리하기 위해 시도하고 삭제할 수 있습니다이 경우

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'속성이 없습니다. 따라서 분할을 사용하여 작업을해야합니다. 위의 코드는 매우 깔끔하게 보이지만 작동 시키면 얻을 수 있습니다. 어떤 제안? – shash

+0

@shabana '스트립'으로 '트림'을 혼동합니다. 지금 고쳐야한다. – 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> 태그를 포함 노드를 통해서도 반복되는 대신, 텍스트 노드의 .data 속성을 사용 (ELEMENT_NODE 노드 유형)뿐만 아니라 들여 쓰기 공백 (TEXT_NODE 노드 유형). 이 소자에있어서, 예를 들어 :

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

세 가지 요소가있다 : 값 \n__ (_로 표시된 공간)

  • ELEMENT_NODE<b>c</b>
  • TEXT_NODE 값과

    • 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)   
    

    가, 그렇지 않으면 당신은 빈 목록 []을 얻을 것 추가됨.

  • 관련 문제