如何解析XML文件,并使用ElementTree的
问题描述:
我已经绞尽脑汁,并在堆栈溢出搜索检索子元素,但似乎我的是一个不同的问题。或者也许是我是Python的新手。无论哪种方式,如果你能帮助我,我会非常感激。我有一个XML文件,摘录如下,我需要解析每个元素及其子元素,并将其保存为字典。我已经尝试了很多东西,但是我得到了不同的错误,现在我处于我的智慧结局!如何解析XML文件,并使用ElementTree的
我已经给出了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的,而不是使用第三方lib和将不胜感激你在我的问题的帮助以上。
感谢, 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函数是如何工作的。
谢谢何塞,但有什么办法,我可以做到这一点使用标准库的ElementTree? – trupsster
''iterparse''函数来自lxml库。它是“ElementTree”的扩展,所以你根本没有移动到任何第三方库。 –
对,但是当我尝试上面的代码时,出现如下错误: ImportError:没有名为lxml的模块 :( – trupsster