문자열 비교가 항상 작동하는 것은 아닙니다. 속성의 순서는 두 노드를 동등하게 고려할 때 중요하지 않습니다. 그러나 문자열 비교를 수행하는 경우 순서가 분명 중요합니다.
>>> from lxml import etree
>>> h1 = etree.XML('<hat color="blue" price="39.90"/>')
>>> h2 = etree.XML('<hat price="39.90" color="blue"/>')
>>> etree.tostring(h1) == etree.tostring(h2)
False
이를 :
나는 그것이 문제 나 기능이 있지만,이 파일이나 문자열에서 구문 분석하는 경우 lxml.etree의 나의 버전은 속성의 순서를 유지 있는지 확실하지 않습니다 버전 의존적 일 수도 있습니다 (저는 Ubuntu에서 lxml.etree 2.3.2와 함께 Python 2.7.3을 사용합니다). 1 년 전쯤에 속성의 순서를 제어 할 수있는 방법을 찾지 못했다는 것을 기억합니다. 가독성을 위해.
다른 serializer에서 생성 된 XML 파일을 비교해야하므로 모든 노드의 태그, 텍스트, 특성 및 하위를 재귀 적으로 비교하는 것 외에 다른 방법은 없습니다. 물론 흥미로운 점이 있다면 물론 꼬리도 있습니다. LXML 및 xml.etree.ElementTree
진리
비교는 구현 의존 할 수 있다는 것이다. 분명히 lxml은 주문 된 dict 또는 이와 유사한 것을 사용합니다. 표준 xml.etree입니다.ElementTree는 속성의 순서가 유지되지 않습니다. (예, 개행 문자가 누락하지만 사소한 문제입니다.)
Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from lxml import etree >>> h1 = etree.XML('<hat color="blue" price="39.90"/>') >>> h2 = etree.XML('<hat price="39.90" color="blue"/>') >>> etree.tostring(h1) == etree.tostring(h2) False >>> etree.tostring(h1) '<hat color="blue" price="39.90"/>' >>> etree.tostring(h2) '<hat price="39.90" color="blue"/>' >>> etree.dump(h1) <hat color="blue" price="39.90"/>>>> etree.dump(h2) <hat price="39.90" color="blue"/>>>>
을 >>> import xml.etree.ElementTree as ET
>>> h1 = ET.XML('<hat color="blue" price="39.90"/>')
>>> h1
<Element 'hat' at 0x2858978>
>>> h2 = ET.XML('<hat price="39.90" color="blue"/>')
>>> ET.dump(h1)
<hat color="blue" price="39.90" />
>>> ET.dump(h2)
<hat color="blue" price="39.90" />
>>> ET.tostring(h1) == ET.tostring(h2)
True
>>> ET.dump(h1) == ET.dump(h2)
<hat color="blue" price="39.90" />
<hat color="blue" price="39.90" />
True
또 다른 질문이 비교 중요하지 않은 whan을 간주되는 수 있습니다. 예를 들어, 일부 조각은 여분의 공백을 포함 할 수 있으므로 신경 쓰지 않아도됩니다. 이런 방식으로, 우리가 필요로하는 정확하게 작동하는 직렬화 함수를 작성하는 것이 항상 더 좋습니다.
두 요소를 비교하는 기능에서 찾을 수있다 [이타 마르의 대답 (http://stackoverflow.com/a/24349916/2371522) 아래 . – One