питон. как получить значение атрибута с libxml2

я использовал 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"? Разбор строки вручную чувствует себя перегруженным. но я не нашел метода, сравнимого с .getAttribute("attribute-name") in минидом.

может ли кто-нибудь предложить правильный метод или направить меня к документации?

3 ответов


for owner in ris:
    for property in owner.properties:
        if property.type == 'attribute':
            print property.name
            print property.content

.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

библиотека lxml использует libxml2 и обеспечивает более приятный интерфейс (api ElementTree) таким образом, вы получаете большую часть преимуществ скорости 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 как отдельный пакет в старых 2.x версии python).

вы можете импортировать любую совместимую версию api ElementTree, используя:

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