питон. как получить значение атрибута с помощью libxml2 - PullRequest
7 голосов
/ 22 июля 2011

Я использовал 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") в минидоме.

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

Ответы [ 3 ]

4 голосов
/ 22 июля 2011

.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
3 голосов
/ 22 июля 2011
for owner in ris:
    for property in owner.properties:
        if property.type == 'attribute':
            print property.name
            print property.content
2 голосов
/ 22 июля 2011

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 в виде отдельного пакета в старых версиях Python 2.x).

Вы можете импортировать любую совместимую версию 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...