我使用的是MINIDOM,但它没有提供xpath方法。
我现在正在尝试使用libxml2,但我无法检索属性值。
我的xml的摘录如下:
<Class name="myclass1" version="0">
<Owner user-login="smagnoni"/>
</Class>
我写了以下代码:
import libxml2
doc = libxml2.parseFile(file)
ris = doc.xpathEval('*/Class[@name="'+className+'" and @version="'+classVersion+'"]/Owner')
print str(ris[0])
返回:
<Owner user-login="smagnoni"/>
我如何得到“smagnoni”?用手解析绳子感觉过度劳累。但我没有找到与minidom中的.getAttribute("attribute-name")
相当的方法。
有人可以建议正确的方法或指导我做文件吗?
答案 0 :(得分:4)
.prop('user-login')
应该有效:
import libxml2
import io
content='''\
<Class name="myclass1" version="0">
<Owner user-login="smagnoni"/>
</Class>
'''
doc = libxml2.parseMemory(content,len(content))
className='myclass1'
classVersion='0'
ris = doc.xpathEval('//Class[@name="'+className+'" and @version="'+classVersion+'"]/Owner')
elt=ris[0]
print(elt.prop('user-login'))
产量
smagnoni
答案 1 :(得分:3)
for owner in ris:
for property in owner.properties:
if property.type == 'attribute':
print property.name
print property.content
答案 2 :(得分:2)
lxml使用libxml2并提供了一个更好的接口(the ElementTree api),因此您可以获得libxml2速度的大部分好处以及它的xpath评估的所有好处。
import lxml.etree as ET
doc = ET.parse(file)
owner = doc.find('/*/Class[@name="'+className+'" and @version="'+classVersion+'"]/Owner')
if owner:
print owner.get('user-login')
额外的好处是元素树api默认在python2.5中可用(尽管1.5中的版本不包含[@name='value']
xpath语法,这是在python 2.7中添加的,但你可以得到1.3 api as a separate package在旧的2.x版python中。{/ p>
您可以使用以下方法导入任何兼容版本的ElementTree api:
try:
from lxml import etree
print("running with lxml.etree")
except ImportError:
try:
# Python 2.5
import xml.etree.cElementTree as etree
print("running with cElementTree on Python 2.5+")
except ImportError:
try:
# Python 2.5
import xml.etree.ElementTree as etree
print("running with ElementTree on Python 2.5+")
except ImportError:
try:
# normal cElementTree install
import cElementTree as etree
print("running with cElementTree")
except ImportError:
try:
# normal ElementTree install
import elementtree.ElementTree as etree
print("running with ElementTree")
except ImportError:
print("Failed to import ElementTree from any known place")