我有这个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中应该采用什么方法来获取它?
答案 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.x,3.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.编写的代码