读取XML文件并在Python中获取其属性值

时间:2012-09-05 21:31:11

标签: python xml xml-parsing python-2.7

我有这个XML文件:

<domain type='kmc' id='007'>
  <name>virtual bug</name>
  <uuid>66523dfdf555dfd</uuid>
  <os>
    <type arch='xintel' machine='ubuntu'>hvm</type>
    <boot dev='hd'/>
    <boot dev='cdrom'/>
  </os>
  <memory unit='KiB'>524288</memory>
  <currentMemory unit='KiB'>270336</currentMemory>
  <vcpu placement='static'>10</vcpu>

现在,我想解析它并获取其属性值。例如,我想获取uuid字段。那么在Python中应该采用什么方法来获取它?

7 个答案:

答案 0 :(得分:21)

这是一个 lxml 代码段,它提取属性以及元素文本(您的问题有点含糊不清你需要的,所以我包括两个):

from lxml import etree
doc = etree.parse(filename)

memoryElem = doc.find('memory')
print memoryElem.text        # element text
print memoryElem.get('unit') # attribute

你(在评论Ali Afshar的回答中)是否 minidom 2.x3.x)是一个不错的选择。这是使用minidom的等效代码;为自己判断哪个更好:

import xml.dom.minidom as minidom
doc = minidom.parse(filename)

memoryElem = doc.getElementsByTagName('memory')[0]
print ''.join( [node.data for node in memoryElem.childNodes] )
print memoryElem.getAttribute('unit')

lxml似乎是我的赢家。

答案 1 :(得分:12)

XML

<data>
    <items>
        <item name="item1">item1</item>
        <item name="item2">item2</item>
        <item name="item3">item3</item>
        <item name="item4">item4</item>
    </items>
</data>

Python:

from xml.dom import minidom
xmldoc = minidom.parse('items.xml')
itemlist = xmldoc.getElementsByTagName('item') 
print "Len : ", len(itemlist)
print "Attribute Name : ", itemlist[0].attributes['name'].value
print "Text : ", itemlist[0].firstChild.nodeValue
for s in itemlist :
    print "Attribute Name : ", s.attributes['name'].value
    print "Text : ", s.firstChild.nodeValue

答案 2 :(得分:1)

etree,lxml可能:

root = etree.XML(MY_XML)
uuid = root.find('uuid')
print uuid.text

答案 3 :(得分:0)

我会使用lxml并使用xpath //UUID

解析它

答案 4 :(得分:0)

其他人可以告诉您如何使用Python标准库来完成它。我推荐自己的迷你图书馆,这使得它非常直接。

>>> obj = xml2obj.xml2obj("""<domain type='kmc' id='007'>
... <name>virtual bug</name>
... <uuid>66523dfdf555dfd</uuid>
... <os>
... <type arch='xintel' machine='ubuntu'>hvm</type>
... <boot dev='hd'/>
... <boot dev='cdrom'/>
... </os>
... <memory unit='KiB'>524288</memory>
... <currentMemory unit='KiB'>270336</currentMemory>
... <vcpu placement='static'>10</vcpu>
... </domain>""")
>>> obj.uuid
u'66523dfdf555dfd'

http://code.activestate.com/recipes/534109-xml-to-python-data-structure/

答案 5 :(得分:0)

上面的XML没有结束标记,它会给出

  

etree parse error:标记中数据的过早结束

正确的XML是:

<domain type='kmc' id='007'>
  <name>virtual bug</name>
  <uuid>66523dfdf555dfd</uuid>
  <os>
    <type arch='xintel' machine='ubuntu'>hvm</type>
    <boot dev='hd'/>
    <boot dev='cdrom'/>
  </os>
  <memory unit='KiB'>524288</memory>
  <currentMemory unit='KiB'>270336</currentMemory>
  <vcpu placement='static'>10</vcpu>
</domain>

答案 6 :(得分:0)

您可以尝试使用(recover = True)对其进行解析。 你可以做这样的事情。

parser = etree.XMLParser(recover=True)
tree = etree.parse('your xml file', parser)

我最近使用了它,并且对我有用,您可以尝试看看,但是如果您需要进行更多复杂的xml数据提取,可以看看我为某些项目handling complex xml data extractions.编写的代码