2009-09-29 5 views
5

저는 Python에서 ElementTree 객체 구조를 사용하여 XML을 만들려고합니다. 처리 지시 사항을 제외하고는 모두 잘 작동합니다. 나는 PI 함수를 ProcessInstruction() 팩토리 함수를 사용하여 쉽게 만들 수있다. 그러나 그것은 elementtree에 추가되지 않는다. 수동으로 추가 할 수 있지만 PI가 정상적으로 배치 된 루트 요소 위에 추가하는 방법을 알아낼 수 없습니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까? 나는 그것을하는 대체 방법을 많이 알고 있지만, 이것은 내가 찾을 수없는 어딘가에 만들어 져야만하는 것처럼 보입니다.ElementTree in Python 2.6.2 처리 지침이 지원됩니까?

답변

5

lxml 라이브러리를 사용해보십시오. ElementTree API 다음에 많은 추가 기능이 추가되었습니다. compatibility overview에서 : etree이 그들을 읽고 각각 설명 또는 ProcessingInstruction 요소로 취급하므로하면서

ElementTree는 의견과 처리 명령 XML을 구문 분석 무시합니다.주석은 텍스트 내용에서 주석을 찾은 다음 주석 요소로 나눠서 표시됩니다.

부울 remove_comments 및/또는 remove_pis 키워드 인수를 사용하는 파서에 전달하여이 동작을 비활성화 할 수 있습니다. 편리하고 이식 가능한 코드를 지원하려면 기본값 etree.XMLParser 대신 etree.ETCompatXMLParser을 사용할 수도 있습니다. 가능한 한 ElementTree 파서에 가깝게 설정된 기본 설정을 제공합니다.

stdlib에는 없지만 표준 경험 ElementTree가 제공하지 않는 물건이 필요할 때 가장 좋습니다. lxml이 API를

2

그래, 가능하다고 생각하지 않습니다. 죄송합니다. ElementTree는 DOM보다 (네임 스페이스가 아닌) 요소 중심의 XML 처리에 대한 더 간단한 인터페이스를 제공하지만 전체 XML 정보 세트를 지원하지 않는다는 점에서 가격이 책정됩니다.

루트 요소 외부에있는 콘텐츠 (주석, PI, doctype 및 XML 선언)를 나타내는 명백한 방법이 없으며 이러한 요소도 구문 분석시 삭제됩니다. (옆에 : DTD 내부 하위 집합에 지정된 기본 속성이 포함되어 ElementTree가 엄격하게 비준수 XML 프로세서라고 말합니다.)

파이썬 네이티브를 서브 클래 싱하거나 멍키 패칭하여이 문제를 해결할 수 있습니다 ElementTree 구현의 write()_root을 _write하기 전에 여분의 PI에 _write을 호출하는 방법이 있지만 약간 깨지기 쉽습니다.

전체 XML 정보 세트에 대한 지원이 필요한 경우 DOM을 사용하는 것이 가장 좋습니다.

1

나는 ElementTree에 대해 많이 모른다. 그러나 "xe"라고 쓰는 라이브러리를 사용하여 문제를 해결할 수도 있습니다.

xe는 구조화 된 XML을 쉽게 만들 수 있도록 설계된 일련의 Python 클래스입니다. 여러 가지 이유로 오랜 시간에 걸쳐 작업하지는 않았지만, 궁금한 점이 있거나 버그를 수정해야 할 경우 도움을 드릴 수 있습니다.

그것은 처리 지침과 같은 것들을 지원하는 기본적인 뼈를 가지고 있으며, 나는 당신이 필요로하는 것을 할 수 있다고 생각합니다. (처리 지시 사항을 추가하기 시작했을 때, 나는 그 코드를 이해할 수 없었고, 코드가 필요 없기 때문에 코드는 일종의 반 - 구운 것입니다.)

유능한. 여기

http://home.avvanta.com/~steveha/xe.html

은 그것을 사용의 예 : 당신은 위의 코드를 실행 한 후 print doc를 실행 한 경우 여기

import xe 
doc = xe.XMLDoc() 

prefs = xe.NestElement("prefs") 
prefs.user_name = xe.TextElement("user_name") 
prefs.paper = xe.NestElement("paper") 
prefs.paper.width = xe.IntElement("width") 
prefs.paper.height = xe.IntElement("height") 

doc.root_element = prefs 


prefs.user_name = "John Doe" 
prefs.paper.width = 8 
prefs.paper.height = 10 

c = xe.Comment("this is a comment") 
doc.top.append(c) 

당신은 얻을 것이 무엇 :

<?xml version="1.0" encoding="utf-8"?> 
<!-- this is a comment --> 
<prefs> 
    <user_name>John Doe</user_name> 
    <paper> 
     <width>8</width> 
     <height>10</height> 
    </paper> 
</prefs> 

당신이 만약 관심이 있지만 도움이 필요하면 알려주세요.

프로젝트에 대한 행운을 빕니다.

6

는 "underdocumented"조금 비록 그것이 쉬울 수 없습니다 : 당신은 최고 수준의 처리 명령이 필요한 경우

는이처럼 만들 :

from lxml import etree 

root = etree.Element("anytagname") 
root.addprevious(etree.ProcessingInstruction("anypi", "anypicontent")) 

가 결과 문서는 다음과 같이 표시됩니다 IMO는이 외에도 고급 API를 설정하는 또 다른 기능 때문에 그들은 확실히 그들의 질문에이를 추가해야

<?anypi anypicontent?> 
<anytagname /> 

.

+1

루트 요소에는 없습니다. –

0
f = open('D:\Python\XML\test.xml', 'r+') 
old = f.read() 
f.seek(44,0)  #place cursor after xml declaration 
f.write('<?xml-stylesheet type="text/xsl" href="C:\Stylesheets\expand.xsl"?>'+ old[44:]) 

저도 같은 문제에 직면하고 올바르게 심지어 내 경우 root.insert (0, PI)의 요소 방법 중 하나를 사용하여 절단하기 위해 여러 가지 방법을 시도한 후 .xml 파일에 PI를 삽입하는 데 실패한 후이 원액 내놓았다되었다 삽입 된 PI를 올바른 위치에만 붙여 넣어 예기치 않은 위치에서 삭제할 데이터를 찾습니다.