如何使用dom解析不带getattribute的xml属性值

2024-10-04 07:24:35 发布

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

我可能在文档中遗漏了一些非常明显的东西,我正在尝试创建一个更通用的解析例程,它不需要知道xml标记名和属性名,只需要知道有一定数量的级别和一定数量的属性。 我试图解析与下面示例类似的xml,以将这些属性的值转换为变量,而不使用这些名称:

<xtest>
    <ytest>
       <ztest idx="1" a="1" b="2" c="3" />
       <ztest idx="2" a="4" b="5" c="6" />
    </ytest>
</xtest>

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from xml.dom import minidom

TAGLVLZERO = 0
TAGLVLONE = 1

def parsemyxmlwithtxttags (xmlfile):

    #load entire xml into memory
    xmldoc = minidom.parse(xmlfile)
    #set first level tag
    xtestnode = xmldoc.getElementsByTagName("xtest")[0]
    #set second level tag     
    ytestnode = xtestnode.getElementsByTagName("ytest")[0]
    #set third level tag     
    ztestnode = ytestnode.getElementsByTagName("ztest")

    Parms = {}
    for l in ztestnode:
        mylist = [l.getAttribute("a") , l.getAttribute("b") , l.getAttribute("c")]
        Parms [l.getAttribute("idx")] = mylist

    print Parms

 def parsemyxml (xmlfile):

    #load entire xml into memory
    xmldoc = minidom.parse(xmlfile)

    xNode = xmldoc.childNodes[TAGLVLZERO]
    print xNode.toxml()
    yNode = xNode.childNodes[TAGLVLONE]
    print yNode.toxml()
    zNode = yNode.childNodes[TAGLVLONE]
    print zNode.toxml()

    #At this point how do I get the attributes out of the znode


def main():
    parsemyxml("tester.xml")
    parsemyxmlwithtxttags("tester.xml")

if __name__ == '__main__':
    main()   

parsexml的输出

^{pr2}$

parsxmlwithtags的输出

{u'1': [u'1', u'2', u'3'], u'2': [u'4', u'5', u'6']}

Tags: 属性defxmllevelprintsetidxminidom
1条回答
网友
1楼 · 发布于 2024-10-04 07:24:35

xml.dom.minidom中,element.childNodes表示元素的子节点,它是元素的列表。当你这样做的时候-

xNode = xmldoc.childNodes[TAGLVLZERO]

yNode = xNode.childNodes[TAGLVLONE]

你实际上是在直接索引这个列表。在xml.dom.minidom中,childNodes可以包含除ELEMENT_NODES之外的其他类型的节点,如TEXT_NODECOMMENT_NODE等。在

对于当前的精确xml,索引是有效的,但是如果稍微改变一下,程序就会崩溃。在

您可以使用Node.attributes来获取元素的属性,这会给您一个^{},它有一个length属性和{}属性,您可以使用item来使用索引来获取属性。在

如果您的目标是深入到xml的两个层次并得到dict/list,就像在第一个例子中那样。您可以使用以下迭代代替-

^{pr2}$

在函数中使用上述代码。在


示例/演示-

>>> from xml.dom.minidom import parseString
>>> s = """<xtest>
...     <ytest>
...        <ztest idx="1" a="1" b="2" c="3" />
...        <ztest idx="2" a="4" b="5" c="6" />
...     </ytest>
... </xtest>"""
>>> xmldoc = parseString(s)
>>> from xml.dom.minidom import Node
>>> params = {}
>>> for xNode in xmldoc.childNodes:
...     if xNode.nodeType == Node.ELEMENT_NODE:
...         for yNode in xNode.childNodes:
...             if yNode.nodeType == Node.ELEMENT_NODE:
...                 for zNode in yNode.childNodes:
...                     if zNode.nodeType == Node.ELEMENT_NODE:
...                         mylist = []
...                         attrs = zNode.attributes
...                         for i in range(attrs.length):
...                             if attrs.item(i).name != 'idx':
...                                 mylist.append(attrs.item(i).value)
...                         params [zNode.getAttribute("idx")] = mylist
...
>>> params
{'1': ['2', '3', '1'], '2': ['5', '6', '4']}

相关问题 更多 >