我有一个文件,可以在短时间内更改内容。但我想在它准备好之前阅读它。问题是,它是一个xml文件(日志)。因此,当您阅读它时,可能会发现并非所有标签都已关闭。
我想知道是否有可能正确关闭所有打开的标签,在浏览器中显示它没有问题(使用xslt样式表)。这应该通过使用python的附带功能来实现。
答案 0 :(得分:5)
一些XML解析器允许对XML文档进行增量解析,解析器可以开始处理文档而无需完全加载。 Python标准库中的xml.etree.ElementTree模块中的XMLTreeBuilder是一个这样的解析器:Element Tree
正如您在下面的示例中所看到的,当您从输入源读取数据时,您可以逐位向解析器提供数据。当各种XML“事件”发生(标记启动,标记数据读取,标记结束)时,处理程序类中的相应钩子方法将被调用,允许您在加载XML文档时处理数据:
from xml.etree.ElementTree import XMLTreeBuilder
class MyHandler(object):
def start(self, tag, attrib):
# Called for each opening tag.
print tag + " started"
def end(self, tag):
# Called for each closing tag.
print tag + " ended"
def data(self, data):
# Called when data is read from a tag
print data + " data read"
def close(self):
# Called when all data has been parsed.
print "All data read"
handler = MyHandler()
parser = XMLTreeBuilder(target=handler)
parser.feed(<sometag>)
parser.feed(<sometag-child-tag>text)
parser.feed(</sometag-child-tag>)
parser.feed(</sometag>)
parser.close()
在此示例中,处理程序将接收五个事件并打印:
某人开始了 某些孩子开始了“text”数据读取
sometag-child结束了
sometag结束
阅读所有数据
答案 1 :(得分:1)
如果我正确理解您的问题,您将有一个始终附加的日志文件,以便您得到类似的内容:
<root>
<entry> ... </entry>
<entry> ... </entry>
...
<entry> ... </entry
<!-- no closing root -->
在这种情况下,您不希望使用DOM解析器,因为它会尝试读取完整的文档并且会阻塞缺少的标记。相反,SAX或Pull解析器可以工作,因为它读取文档就像数据流而不是完整的树。正如Denis上面回复的那样,您可以在结束时关闭缺失的标签,也可以在写出之前忽略任何不完整的标签。
答案 2 :(得分:0)
您可以通过向目前提供的数据提供任何SAX解析器。使用刚刚重建源XML的SAX处理程序,打开标签堆栈并在结束时以相反的顺序关闭它们。
答案 3 :(得分:0)
您可以使用BeautifulStoneSoup(BeautifulSoup的XML部分)。
www.crummy.com/software/BeautifulSoup
这不太理想,但是如果你无法修复文件的输出,它会绕过这个问题......
这基本上是丹尼斯所说的以前实施的版本。
你可以加入你需要的任何东西到汤中,它会尽力解决它。