如何在Python中读取XML头

时间:2018-02-23 04:16:27

标签: python xml python-3.x xml-parsing

如何在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,但找不到任何相关的内容。)

3 个答案:

答案 0 :(得分:3)

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

def do_a_thing(stuff, special=False):
    special_value = 'IMPORTANT_VALUE' if special else EMPTY_VALUE

    response = some.library.func(
        first=os.environ['first'],
        second=stuff['second'],
        third=stuff['third']
        fourth='Some Value',
        fifth=False,
        sixth=special_value,
        seventh='example',
        eighth=True
    )

    return response

输出:

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,代码使用相同的输出。

答案 1 :(得分:3)

使用lxml库,您可以通过DocInfo对象访问文档属性。

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)

输出:

 
<?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">

答案 2 :(得分:0)

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

我声明了一个具有XmlDecl函数的MyParser类来打印XML标题&amp;第二个函数的目的是解析XML头.so首先使用xml.parsers中定义的ParserCreate()函数创建解析器。

现在创建MyParser类'解析器'的对象&amp;使用对象引用调用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)