2012-09-20 4 views
2

XML 파일을 구문 분석하는 Python 프로그램을 만들고 있습니다. NodeList를 반복 할 필요가 있지만 "NodeList in node"구문을 사용하여 문제가 발생했습니다. 여기 Python/Minidom : NodeList 반복하기

docToInclude = parse(node.getAttribute("file")) 

print ("childNode count : " , len(docToInclude.documentElement.childNodes)) 
print ("childNodes : " , docToInclude.documentElement.childNodes) 
print("") 

for i in range(0, len(docToInclude.documentElement.childNodes)): 
    print ("i = ", i , "nodeName = " + docToInclude.documentElement.childNodes[i].nodeName) 

print("") 

for elementNode in docToInclude.documentElement.childNodes : 
    print ("node name : " , elementNode.nodeName) 
    node.parentNode.insertBefore(elementNode, insertPosition) 

가 출력된다 : 여기서

코드 샘플이다

childNode count : 3 
childNodes : [<DOM Text node "'\n\n\t'">, <DOM Element: messageList at 0x3a4e570>, <DOM Text node "'\n\n'">] 

i = 0 nodeName = #text 
i = 1 nodeName = messageList 
i = 2 nodeName = #text 

node name : #text 
node name : #text 

I는 노드 목록 구문 노드에 대해, 소자는 스킵으로 반복하는 경우. 이 문제의 출처에 대해 알고 계십니까?

답변

2

요소를 반복하면서 요소를 childNodes 밖으로 이동하고 있습니다. 이 childNodes 목록 변경 :

>>> lst = [1, 2, 3] 
>>> for i, elem in enumerate(lst): 
... print i, elem 
... del lst[i] 
...  
0 1 
1 3 

당신은 대신 목록 복사 반복해야합니다을; 여기에 나는 [:] 슬라이스 표기법을 사용하여 목록의 복사본을 생성 :

for elementNode in docToInclude.documentElement.childNodes[:]: 
    print ("node name : " , elementNode.nodeName) 
    node.parentNode.insertBefore(elementNode, insertPosition) 

비록 자신에게 큰 호의를 수행하고 대신 ElementTree API를 사용합니다; 다음을 수행합니다

from xml.etree import ElementTree as ET 

etree = ET.fromstring(data) 
for element in etree.findall('messageList'): 
    print element 
0

에 appendChild() :이 API는 XML의 DOM의 API보다 사용하기 훨씬 pythononic하고 쉽게 이 enter image description here

난 그냥 코드에서 그것을 배울를 사용 튜플() 할 수 있습니다 속임수.