如何在Python中读取XML头

2024-10-05 15:21:59 发布

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

在python3中如何读取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,但没有找到任何相关的东西)。在


Tags: 模块文档thatversiondocumentation情况itxml
3条回答

使用lxml库,可以通过^{}对象访问文档属性。在

from lxml import etree

tree = etree.parse('input.xml')
info = tree.docinfo
v, e, d = info.xml_version, info.encoding, info.doctype

print('<?xml version="{}" encoding="{}"?>'.format(v, e))
print(d)

输出:

^{pr2}$

试试这个代码! 我假设变量's'中有临时xml。在

我声明了一个MyParser类,它有一个XmlDecl函数来打印XML头,第二个函数的目的是解析XML头xml.parser. 在

现在创建MyParser类'parser'的对象,并使用对象引用调用parse函数。在

from xml.parsers import expat

s = """<?xml version='1.0' encoding='iso-8859-1'?>
       <book>
           <title>Title</title>
           <chapter>Chapter 1</chapter>
       </book>"""

class MyParser(object):
    def XmlDecl(self, version, encoding, standalone):
        print ("XmlDecl", version, encoding, standalone)

    def Parse(self, data):
        Parser = expat.ParserCreate()
        Parser.XmlDeclHandler = self.XmlDecl
        Parser.Parse(data, 1)

parser = MyParser()
parser.Parse(s)

我尝试了^{},根据您提供的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())

输出:

^{pr2}$

您可以从defusedxml使用minidom。我下载了那个包,用from defusedxml.minidom import parse替换import,代码使用相同的输出。在

相关问题 更多 >