如何在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
,并且代码具有相同的输出。