蟒蛇。如何使用libxml2获取属性值

时间:2011-07-22 14:28:44

标签: python xml get

我使用的是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")相当的方法。

有人可以建议正确的方法或指导我做文件吗?

3 个答案:

答案 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")