2

我已经绞尽脑汁,也在 Stack Overflow 中进行了搜索,但我的问题似乎是另一个问题。或者也许是因为我是 Python 的新手。无论哪种方式,如果你能帮助我,我将永远感激不尽。我有一个 XML 文件,摘录如下,我需要解析每个元素及其子元素,并将它们保存在字典中。我已经尝试了很多东西,但是我得到了不同的错误,现在我束手无策了!

我在下面给出了 XML 文件和我的代码的一个版本(经过多次尝试和错误检索子元素的方法后剥离):

<nmwg:message>
    <nmwg:parameters id="storeId">
        <nmwg:parameter name="ID">NameA</nmwg:parameter>
    </nmwg:parameters>

    <!--Metadata and Data-->
    <nmwg:metadata id="md1">
        <nmwg:subject id="subject-port-A">
            <nmwgtopo3:port id="urn:ogf:network:domaina.net:port:A">
                <nmwgtopo3:name type="logical">portA</nmwgtopo3:name>
                <nmwgtopo3:country>COUNTRY</nmwgtopo3:country>              <!--Optional, can be left empty-->
                <nmwgtopo3:city>CITY</nmwgtopo3:city>                       <!--Optional, can be left empty-->
                <nmwgtopo3:institution>INSTITUTION</nmwgtopo3:institution>  <!--Optional, can be left empty-->
                <nmwgtopo3:latitude>LATITUDE</nmwgtopo3:latitude>           <!--Optional, can be left empty-->
                <nmwgtopo3:longitude>LONGTITUDE</nmwgtopo3:longitude>       <!--Optional, can be left empty-->
            </nmwgtopo3:port>
        </nmwg:subject>
    </nmwg:metadata>
    <nmwg:data id="d1" metadataIdRef="md1">
            <ifevt:datum timeType="ISO" timeValue="2006-12-04T16:43:38.0+0000">                
                <ifevt:ifInOctets>integer-number</ifevt:ifInOctets>     <!--Integer number in bytes -->
                <ifevt:ifOutOctets>integer-number</ifevt:ifOutOctets>   <!--Integer number in bytes -->                
            </ifevt:datum>
    </nmwg:data>
</nmwg:message>

这是我的代码:

from __future__ import print_function
from pprint import pprint
import ConfigParser, os
import xml.etree.ElementTree as ET

dataXMLFile = 'xmlFile.xml'
data = ET.parse (dataXMLFile)
root = data.getroot()

for child in root:
    print ('Tag: ' + child.tag)
    print ('Attrib: ' + str(child.attrib))
print()

domainId = data.findall('{http://ggf.org/ns/nmwg/base/2.0/}parameters/*')
for item in domainId:
    print ('Tag: ' + item.tag)
    print ('Attrib: ' + str(item.attrib))
print()

domainId = data.findall('{http://ggf.org/ns/nmwg/base/2.0/}metadata/*')
for item in domainId:
    print ('Tag: ' + item.tag)
    print ('Attrib: ' + str(item.attrib))
print()

domainId = data.findall('{http://ggf.org/ns/nmwg/base/2.0/}metadata/*/*')
for item in domainId:
    print ('Tag: ' + item.tag)
        print ('Attrib: ' + str(item.attrib))
print()

domainId = data.findall('{http://ggf.org/ns/nmwg/base/2.0/}metadata/*/*/*')
for item in domainId:
    print ('Tag: ' + item.tag)
    print ('Attrib: ' + str(item.attrib))
print()

我想解析 XML 文件,以便我可以portA<nmwgtopo3:name type="logical">. 我试过了,但我只能从中得到type='logical'一点。类似地,我想COUNTRY<nmwgtopo3:country>CITYfrom <nmwgtopo3:city>、 integer-number (这将是一个适当的整数值)中提取<ifevt:ifInOctets>,等等。

我更喜欢坚持使用 ElementTree 而不是使用 3rd 方库,并希望您在我上面的问题中提供帮助。

谢谢,特鲁普斯特

4

1 回答 1

1

您正在寻找的是 lxml 文档中的iterparse / iterwalk文档。

使用 iterparse 实用程序函数,您可以遍历 XML 的元素,就像这样:

from lxml import etree
from cStringIO import StringIO

with open('your_file.xml', 'r') as f:
    context = etree.iterparse(StringIO(f.read()))

    for action, element in context:
        print('{0}:{1} {2}'.format(element.tag, element.attrib, element.text))

如果您在 XML 文件所在的任何位置运行该代码,您将看到与此类似的输出:

parameter:{'name': 'ID'} NameA
parameters:{'id': 'storeId'}

name:{'type': 'logical'} portA
country:{} COUNTRY
city:{} CITY
institution:{} INSTITUTION
latitude:{} LATITUDE
longitude:{} LONGTITUDE
port:{'id': 'urn:ogf:network:domaina.net:port:A'}

subject:{'id': 'subject-port-A'}

metadata:{'id': 'md1'}

ifInOctets:{} integer-number
ifOutOctets:{} integer-number
datum:{'timeValue': '2006-12-04T16:43:38.0+0000', 'timeType':

所以你可以看到 iterparse/iterwalk 函数是如何工作的。

于 2013-07-09T09:47:06.200 回答