питон. как получить значение атрибута с 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")