2013-01-10 2 views
5

웹 사이트 및 웹 사이트 양식을 구성하는 데 사용되는 일반 XML 파일을 표준화하기 위해 python 스크립트를 작성하려고합니다. 그러나이 작업을 수행하려면 요소의 원래 속성 순서를 유지하거나 미리 정의 된 방식으로 재 배열 할 수 있어야합니다. 현재 대부분의 xml 파서는 애트리뷰트 순서를 영숫자로 다시 작성하려고 시도했습니다. 이 XML 파일은 사람이 읽고 쓰고 유지 관리하기 때문에 너무 유용하지는 않습니다.Elementtree 설정 속성 순서

예를 들어 일반 요소는 XML에서 다음과 같이 보일 수 있습니다.

<Question QuestionRef="XXXXX" DataType="Integer" Text="Question Text" Availability="Shown" DefaultAnswer="X"> 

이 변경됩니다 그러나 한 번 elementtree 및 재 작성 새 파일로 통과 : 위해 XML 파일의 큰 숫자를 표준화하는 스크립트의 목적으로

<Question Availability="Shown" DataType="Integer" DefaultAnswer="X" PartType="X" QuestionRef="XXXXX" Text="Question Text"> 

되는 동료들 사이의 가독성을 높이고 요소의 속성에 포함 된 정보가 다양한 수준의 중요성 (예 : QuestionRef가 매우 중요 함)을 갖도록하려면 속성을 현명하게 정렬해야한다고 명시합니다.

필자는 python dicts (어떤 속성이 저장되어 있는지)는 자연스럽게 정렬되어 있지 않으며 XML 사양 상태는 속성 순서가 중요하지 않다는 것을 알고 있지만 인간의 가독성 요소는 스크립트의 원동력입니다.

(스택 오버플로 관련)이 질문과 관련하여 pxdom이이 작업을 수행 할 수 있음을 알았지 만 (질문 링크 : link) pxdom 설명서에서이 작업을 수행 할 수있는 방법에 대한 언급이 없습니다. Google 검색을 사용합니다. 속성의 순서를 유지하거나 현재 XML 파서를 사용하여 속성을 정의하는 방법이 있습니까? 가급적 핫 패칭에 의지하지 않고 :)!

누구든지 도움을 주실 수 있으면 크게 감사하겠습니다. :). 아래 ::
ElementTree.py 파일에 언급 된

+2

에 존재 프레드릭 룬트 (Fredrik Lundh)에 의해 저작권 메시지를 읽을 나의 첫번째하지만 어쩌면 당신은 인간의 편집 (예 : YAML로?) 다른 파일 형식을 사용해야한다는 것입니다 - 다음 XML에 그 번역 시스템에 의해 필요한 경우 ... –

+0

속성의 순서가 중요하다면 하위 요소 (예 :' Shown')를 사용하는 것을 고려 했습니까? 거기서 명령은 확실히 보존됩니다. – Constantinius

+0

문제는 XML이 HTML 및 javscript로 웹 사이트를 생성하는 C# 코드로 전달된다는 것입니다. 이 코드는 약 5 년 동안 개발되었으므로 다소 부피가 커졌습니다. 따라서 가용성을 하위 요소로 이동하는 것처럼 XML에서 전환하는 것은 실현 불가능합니다. 도와 줘서 고마워. :) –

답변

5

원숭이 패치를 적용, _serialize_xml로 명명하는 기능이있다; 이 함수에서
; 아래에 언급 된 패치를 적용하십시오.

 ##for k, v in sorted(items): # remove the sorted here 
     for k, v in items: 
      if isinstance(k, QName): 
       k = k.text 
      if isinstance(v, QName): 
       v = qnames[v.text] 
      else: 
       v = _escape_attrib(v, encoding) 
      write(" %s=\"%s\"" % (qnames[k], v)) 

여기에; sorted(items)을 제거하고 위의 작업을 수행 한 것처럼 items으로 만듭니다.

네임 스페이스를 기반으로 정렬을 사용하지 않도록 설정합니다 (위의 패치에서 xml 특성에 네임 스페이스가있는 경우 정렬이 여전히 존재하므로 그렇지 않으면 네임 스페이스가 없으면 위의 사항은 정상적으로 작동 함). 그래서 그렇게, ElementTree.py

지금 당신은 당신이 XML 요소로 추가 한 같은 순서로 모든 속성을 가지고에서 collections.OrderedDict() 모든 {}를 교체합니다.

위의 모든 작업을 수행하기 전에; ElementTree.py

+0

고맙다. 나는 가야 해. –

+0

그래, 작동 했니? – meowsqueak