2010-12-17 6 views
11

현재 파이썬 2.4.3 사용, 그리고 하나 개 이상의 태그에 지정된 속성의 값을 변경하려면파이썬/ElementTree를 사용하여 XML을 구문 분석하는 동안 의견을 유지하는 방법

를 업그레이드 할 수 없습니다 함께 업데이트 된 파일에 XML 주석이 있습니다.

내가 인수로 XML 파일을 소요하고

def update(file, state): 
    global Etree 
    try: 
     from elementtree import ElementTree 
     print '*** using ElementTree' 
    except ImportError, e: 
     print '***' 
     print '*** Error: Must install either ElementTree or lxml.' 
     print '***' 
     raise ImportError, 'must install either ElementTree or lxml' 
    #end try 

    doc = Etree.parse(file) 
    root = doc.getroot() 

    for element in root.findall('.//StateManageable'): 
     element.attrib['initialState'] = state 
    #end for 
    doc.write(file) 
#end def 

이, 속성 "모든 괜찮 아래와 같이 지정된 각 태그, 속성을 변경하는 파이썬 스크립트를 작성 관리해야

초기 상태 (Initial) "원래 XML에 많은 XML 주석이 포함되어 있다는 것을 제외하고는 업데이트되었지만 오래 전에 사라졌습니다.

구문 분석은 XML 구조 만 검색하는 것으로 의심되지만 XML 구조는 구조의 일부인 것으로 생각했습니다. 또한 원래 문서의 "사람이 읽을 수있는"형식은 오래 전에 사라 졌음을 깨달았습니다. 그러나 실현 된 것은 예상되는 동작이며 나중에 xmllint --format 또는 XSL을 사용하여 형식을 지정해야합니다.

+3

2.4? 내 동정. – delnan

+0

당신은 내가 처음 발견 한 스크립트를 만들 때 어려움을 겪었습니다. _all_ 예제가 2.7이라는 좋은 것을 발견했습니다 :-) – rhellem

답변

16

나는 이것이 오래되었다는 것을 알고있다. 그러나 나는이 대답을 통해 비평을 유지하는 방법에 대해 우연히 발견했다. 나무에 주석을 넣는 방법에 대한 Frederik의 published instructions은 현재 ElementTree의 최신 버전에서 여전히 작동하지만 최소한 내 용도에 필요한 것 이상을 수행합니다. XML은 엘리먼트에 포함되어 있기 때문에 바람직하지 않습니다. 또한 보존 된 처리 명령은 필요 없지만 주석 만 필요합니다. 같은

import xml.etree.ElementTree as ET 

class PCParser(ET.XMLTreeBuilder): 

    def __init__(self): 
     ET.XMLTreeBuilder.__init__(self) 
     # assumes ElementTree 1.2.X 
     self._parser.CommentHandler = self.handle_comment 

    def handle_comment(self, data): 
     self._target.start(ET.Comment, {}) 
     self._target.data(data) 
     self._target.end(ET.Comment) 

는, 이것을 사용는 '파서'로이 개체의 인스턴스를 만든 다음 ElementTree.parse에 매개 변수로 전달할() : 그래서, 나는 그가이의 사이트에서 제공하는 클래스를 손질 이 :

parser = PCParser() 
self.tree = ET.parse(self.templateOut, parser=parser) 

내가 코드에 대한 어떠한 신용을하지 않거나 ElementTree의 문서화되지 않은 사용하지만 원래의 문서 구조에 영향을주지 않고 주석 만 보존에 나를 위해 작동합니다. ElementTree에 대한 향후 변경 사항은 (이 모든 경우에이 시점에서이 시점에서는보기 힘들 것 같음)이 문제를 해결할 것이라는 점에 유의하십시오.

+0

저는 이것을 위해'lxml'을 사용하고 있습니다. 저는'lxml import etree from et'를 가져 왔습니다. 나는'self._parser'를'et'로 대체 할 수 있다고 생각하지만'self._target' 대신 무엇을 사용해야 하는지를 알 수 없습니다. 도울 수 있니? – eoinzy

관련 문제