2016-10-10 4 views
7

Mindom에서 반환 된 요소의 순서는 동일한 계층 구조/요소의 요소에 대한 문서의 요소와 동일합니까? getElementsByTagName?minidom getElementsByTagName의 요소 순서

내가 image_siblings이 같은 순서로 이미지를 포함 할 경우 알 필요가
images = svg_doc.getElementsByTagName('image') 
    image_siblings = [] 
    for img in images: 
     if img.parentNode.getAttribute('layertype') == 'transfer': 
      if img.nextSibling is not None: 
       if img.nextSibling.nodeName == 'image': 
        image_siblings.append(img.nextSibling) 
       elif img.nextSibling.nextSibling is not None and img.nextSibling.nextSibling.nodeName == 'image': 
        image_siblings.append(img.nextSibling.nextSibling) 

는, 그들은 동일한 계층 구조에 대한 문서에 배치됩니다.

JavaScript에 대해 question과 비슷한 것을 찾았지만 Python (버전 3.5.2) Minidom getElementsByTagName에도 해당되는지 확실하지 않습니다.

답변

6

는 (파이썬 2.7) 코드에 따르면, 코드 인 _get_elements_by_tagName_helper 기능에 getElementsByName 방법 릴레이 :

def _get_elements_by_tagName_helper(parent, name, rc): 
    for node in parent.childNodes: 
     if node.nodeType == Node.ELEMENT_NODE and \ 
      (name == "*" or node.tagName == name): 
      rc.append(node) 
     _get_elements_by_tagName_helper(node, name, rc) 
    return rc 

이것이 의미하는 것은 getElementByName의 순서는 당신이 가지고있는 것과 같은 점이다 childNodes

그러나 이것은 tagName이 같은 수준에서만 나타나는 경우에만 해당됩니다. 같은 함수 안에 _get_elements_by_tagName_helper이라는 재귀 호출이 있음을 알 수 있습니다. 즉, 트리에 더 깊게 배치 된 tagName과 같은 요소는 상위 레벨에있는 요소와 인터리브됩니다.

문서가 인 경우 XML 텍스트 파일 또는 문자열을 의미하는 경우 질문은 DOM의 요소를 만들 때 파서가 순서를 존중하는지 여부로 이동합니다. xml.dom.minidom에서 parse 함수를 사용하는 경우 pyexpat 라이브러리에 중계하고 그 다음에 expat C 라이브러리를 사용합니다.

그래서 짧은 대답은 다음과 같습니다

는 당신이 XML DOM에서 계층 구조의 동일한 수준의 태그 이름 만 존재하는 경우, 그 다음 순서가 존중된다. 트리의 다른 노드에서 동일한 tagName을 사용하면 해당 요소가 상위 레벨의 태그로 인터리브됩니다. 존중 순서는 minidom 문서 객체의 요소 순서이며 파서에 따라 다릅니다.

봐이 예 :

>>> import StringIO 
>>> from xml.dom.minidom import parseString 
>>> s = '''<head> 
... <tagName myatt="1"/> 
... <tagName myatt="2"/> 
... <tagName myatt="3"/> 
... <otherTag> 
...  <otherDeeperTag> 
...  <tagName myatt="3.1"/> 
...  <tagName myatt="3.2"/> 
...  <tagName myatt="3.3"/> 
...  </otherDeeperTag> 
... </otherTag> 
... <tagName myatt="4"/> 
... <tagName myatt="5"/> 
... </head>''' 
>>> doc = parseString(s) 
>>> for e in doc.getElementsByTagName('tagName'): 
...  print e.getAttribute('myatt') 
... 
1 
2 
3 
3.1 
3.2 
3.3 
4 
5 

이 파서가 XML 문자열의 순서 구조 (대부분의 파서 순서는 그것을 존중하기 쉽기 때문에 그 점) 존중하지만 난 하나를 찾을 수 없습니다 보인다 그것을 확인하는 문서. 내 말은, 파서가 문서의 크기에 따라 목록을 사용하여 요소를 저장하기 위해 해시 테이블로 이동하고 그 결과가 순서를 깨뜨릴 수 있다는 (이상한) 경우 일 수 있습니다. XML 표준은 요소의 순서를 지정하지 않으므로 순서를 고려하지 않는 파서도 불만을 제기합니다.