如何解析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函数是如何工作的。

+0

谢谢何塞,但有什么办法,我可以做到这一点使用标准库的ElementTree? – trupsster

+0

''iterparse''函数来自lxml库。它是“ElementTree”的扩展,所以你根本没有移动到任何第三方库。 –

+0

对,但是当我尝试上面的代码时,出现如下错误: ImportError:没有名为lxml的模块 :( – trupsster