关闭所有打开的xml标记

2024-04-19 16:44:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,它能在短时间内改变它的内容。但我想在它准备好之前读一读。问题是,它是一个xml文件(log)。所以当你读到的时候,可能是,不是所有的标签都关闭了。在

我想知道是否有可能正确关闭所有打开的标记,在浏览器中显示它没有问题(使用xslt stylsheet)。这应该通过使用python包含的特性来实现。在


Tags: 文件标记log内容浏览器标签特性xml
3条回答

如果我正确地理解了您的问题,那么您有一个日志文件,它总是被附加在后面,因此您会得到如下内容:

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

在这种情况下,您不希望使用DOM解析器,因为它试图读取完整的文档,并且会被丢失的标记阻塞。相反,SAX或Pull解析器可以工作,因为它像数据流一样读取文档,而不是完整的树。正如丹尼斯在上面回答的,您可以在结尾处关闭丢失的标记,也可以在写出之前忽略任何不完整的标记。在

XML parsing on Wikipedia

在不需要XML文档解析的情况下,可以对一些XML文档进行完全的解析。中的XMLTreeBuilderxml.etree.ElementTreePython标准库中的模块就是这样一个解析器: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 child开始

“文本”数据读取

sometag孩子结束了

sometag结束

所有数据读取

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

相关问题 更多 >