당신은이 SAX와 같은 target parser interface 사용하여 시도 할 수 :
from lxml import etree
class SkipStartEndTarget:
def __init__(self, *args, **kwargs):
self.builder = etree.TreeBuilder()
self.skip = False
def start(self, tag, attrib, nsmap=None):
if tag == 'start':
self.skip = True
if not self.skip:
self.builder.start(tag, attrib, nsmap)
def data(self, data):
if not self.skip:
self.builder.data(data)
def comment(self, comment):
if not self.skip:
self.builder.comment(self)
def pi(self, target, data):
if not self.skip:
self.builder.pi(target, data)
def end(self, tag):
if not self.skip:
self.builder.end(tag)
if tag == 'end':
self.skip = False
def close(self):
self.skip = False
return self.builder.close()
당신은 다음 parser target
을 만들기 위해 SkipStartEndTarget
클래스를 사용할 수 있으며, 다음과 같이 그 대상과의 사용자 정의 XMLParser
을 만듭니다
parser = etree.XMLParser(target=SkipStartEndTarget())
필요한 경우 파서에 다른 파서 옵션을 제공 할 수 있습니다. 그럼 당신은 예를 들어, 사용중인 파서 기능이 파서를 제공 할 수
elem = etree.fromstring(xml_str, parser=parser)
을 아마 인 (이것은 또한 etree.XML()
와 etree.parse()
와 함께 작동, 당신은 심지어 etree.setdefaultparser()
와 기본 파서로 파서를 설정할 수 있습니다 좋은 아이디어). 당신을 여행 할 수있는 한가지 : 심지어 etree.parse()
으로, 이것은 elementtree를 반환하지 않을 것이지만, 언제나 한 요소 (etree.XML()
과 etree.fromstring()
처럼)를 반환 할 것입니다. 나는 이것이 (아직) 완료 될 수 있다고 생각하지 않는다. 그래서 이것이 당신에게 문제가된다면, 어떻게 든 해결해야 할 것이다.
sax 이벤트의 elementtree를 lxml.sax과 함께 생성하는 것도 가능합니다. 다소 어려울 수도 있고 느릴 수도 있습니다. 위의 예와는 달리 elementtree를 반환하지만 etree.parse()
을 정상적으로 사용할 때 얻을 수있는 .docinfo
을 제공하지 않는다고 생각합니다. 나는 또한 (현재) 코멘트와 파이를 지원하지 않는다고 믿는다.(아직 사용하지 않았기 때문에 지금은 더 이상 정확하지 않습니다.)
도큐먼트를 파싱하는 SAX와 같은 접근법은 <start/>
과 <end/>
사이의 모든 것을 건너 뛰어도 우물 귀하의 예에서는 그렇지만 두 번째 <p>
이 <p2>
인 경우에는 그렇지 않습니다. 결국 <p>....</p2>
으로 끝날 것입니다.
오, 나는 그것에 대해 뭔가를 할 수 있었으면 좋겠다. 이것은 ODT 파일이다. 그들은 "변경 사항 추적"을 위해이 파일을 사용합니다. 불행히도 etree를 사용하는 파일에서 다른 조작을 많이하고 있으므로 SAX로 전환 할 수 있는지 잘 모르겠습니다. 그것들을 조사 할 필요가 있습니다. – user61000