2009-10-29 217 views
4

我有一个文件,可以在短时间内更改它的内容。但是我想在它准备好之前阅读它。问题是,它是一个xml文件(日志)。所以当你阅读它时,可能并非所有的标签都被关闭。关闭所有打开的xml标签

我想知道是否有正确关闭所有打开的标签的可能性,不存在任何问题,以显示它在浏览器(使用XSLT stylsheet)。这应该通过使用Python的包含功能。

回答

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() 

在这个例子中,处理器会得到五个事件和打印:

sometag开始

sometag孩子开始

“文本” 数据读取

sometag儿结束

sometag结束

所有数据读取

0

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

1

如果我理解正确你的问题,你有一个总是被附加一个日志文件,以使你得到的东西,如:

<root> 
<entry> ... </entry> 
<entry> ... </entry> 
... 
<entry> ... </entry 
<!-- no closing root --> 

在这种情况下,你不希望,因为它试图读取一个完整的文件,将呛缺少的标记使用DOM解析器。相反,SAX或Pull解析器可以工作,因为它像一串数据而不是一个完整的树读取文档。正如Denis上面所回答的那样,您可以在结束时关闭缺失的标签,或者在写出之前忽略任何不完整的标签。

XML parsing on Wikipedia

0

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

www.crummy.com/software/BeautifulSoup

它的效果并不理想,但它会绕过这个问题,如果你不能修复该文件的输出...

总的来说,这就是丹尼斯的先前版本实现说过。

你可以随意加入任何你需要的汤,它会尽最大努力修复它。