关闭所有打开的xml标记

时间:2009-10-29 16:36:38

标签: python xml

我有一个文件,可以在短时间内更改内容。但我想在它准备好之前阅读它。问题是,它是一个xml文件(日志)。因此,当您阅读它时,可能会发现并非所有标签都已关闭。

我想知道是否有可能正确关闭所有打开的标签,在浏览器中显示它没有问题(使用xslt样式表)。这应该通过使用python的附带功能来实现。

4 个答案:

答案 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上面回复的那样,您可以在结束时关闭缺失的标签,也可以在写出之前忽略任何不完整的标签。

XML parsing on Wikipedia

答案 2 :(得分:0)

您可以通过向目前提供的数据提供任何SAX解析器。使用刚刚重建源XML的SAX处理程序,打开标签堆栈并在结束时以相反的顺序关闭它们。

答案 3 :(得分:0)

您可以使用BeautifulStoneSoup(BeautifulSoup的XML部分)。

www.crummy.com/software/BeautifulSoup

这不太理想,但是如果你无法修复文件的输出,它会绕过这个问题......

这基本上是丹尼斯所说的以前实施的版本。

你可以加入你需要的任何东西到汤中,它会尽力解决它。