我已经绞尽脑汁,还在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>
,CITY
从中提取的<nmwgtopo3:city>
整数(将是一个适当的整数值)<ifevt:ifInOctets>
,依此类推。
我更喜欢坚持使用ElementTree而不使用第3方库,并且希望您对我的上述问题有所帮助。
谢谢,Trupsster
您正在寻找的是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函数的工作方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句