http://docs.python.org/library/xml.sax.html
Обратите внимание, что вы можете передать объект stream в xml.sax.parse
. Это означает, что вы, вероятно, можете передать любой объект с файловыми методами (например, read
) в вызов parse
... Создайте свой собственный объект, который сначала поместит начальный тэг вашего виртуального корня, а затем содержимое файла. затем виртуальный корневой конечный тег. Я предполагаю, что вам нужно реализовать только метод read
... но это может зависеть от используемого вами синтаксического анализатора.
Пример, который работает для меня:
import xml.sax
import xml.sax.handler
class PseudoStream(object):
def read_iterator(self):
yield '<foo>'
yield '<bar>'
for line in open('test.xml'):
yield line
yield '</bar>'
yield '</foo>'
def __init__(self):
self.ri = self.read_iterator()
def read(self, *foo):
try:
return self.ri.next()
except StopIteration:
return ''
class SAXHandler(xml.sax.handler.ContentHandler):
def startElement(self, name, attrs):
print name, attrs
d = xml.sax.parse(PseudoStream(), SAXHandler())