如何在Python 3中读取XML文档的标题?

理想情况下,我将defusedxml模块用作documentation states that it's safer,但是在这一点上(经过数小时的努力来弄清楚这一点),我愿意使用任何解析器。

例如,我有一个看起来像这样的文档(实际上是来自练习):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <!-- this is root -->
    <!-- CONTENTS -->
</plist>

我想知道如何访问根节点之前的所有内容。

这似乎是一个一般性的问题,我以为我可以轻松地在网上找到答案,但是我想我错了。我找到的最接近的东西是this question on Stack Overflow,它并没有真正的帮助(我调查了xml.sax,但是找不到任何相关的东西)。

最佳答案

我尝试了 minidom ,根据您提供的link,它容易受到数十亿次笑声和二次爆炸的攻击。这是我的代码:

from xml.dom.minidom import parse

dom = parse('file.xml')
print('<?xml version="{}" encoding="{}"?>'.format(dom.version, dom.encoding))
print(dom.doctype.toxml())
#or
print(dom.getElementsByTagName('plist')[0].previousSibling.toxml())
#or
print(dom.childNodes[0].toxml())

输出:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist  PUBLIC '-//Apple Computer//DTD PLIST 1.0//EN'  'http://www.apple.com/DTDs/PropertyList-1.0.dtd'>
<!DOCTYPE plist  PUBLIC '-//Apple Computer//DTD PLIST 1.0//EN'  'http://www.apple.com/DTDs/PropertyList-1.0.dtd'>
<!DOCTYPE plist  PUBLIC '-//Apple Computer//DTD PLIST 1.0//EN'  'http://www.apple.com/DTDs/PropertyList-1.0.dtd'>

您可以使用minidom中的defusedxml。我下载了该软件包,只是将导入替换为from defusedxml.minidom import parse,并且代码具有相同的输出。

09-26 08:18