简体   繁体   中英

python. how to get attribute value with libxml2

I was using MINIDOM but it does not provide xpath methods.

I am now trying to use libxml2 but I am having trouble retrieving attribute values.

An extract of my xml looks as follow:

<Class name="myclass1" version="0">
    <Owner user-login="smagnoni"/>
</Class>

and I wrote the following code:

import libxml2
doc = libxml2.parseFile(file)
ris = doc.xpathEval('*/Class[@name="'+className+'" and @version="'+classVersion+'"]/Owner')
print str(ris[0])

which returns:

<Owner user-login="smagnoni"/>

How do I get just "smagnoni"? Parsing the string by hand feels overworked. but I did not find a method comparable to .getAttribute("attribute-name") in minidom.

Can anyone suggest the proper method or direct me to documentation?

.prop('user-login') should work:

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

yields

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

lxml uses libxml2 and provides a nicer interface ( the ElementTree api ) so you get most of the benefit of libxml2's speed and all of the benefit of it's xpath evaluation.

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

The added bonus is that the Element Tree api is available by default in python2.5 (though the version in 1.5 does not include the [@name='value'] xpath syntax, that was added in python 2.7, but you can get the 1.3 api as a separate package in older 2.x versions of python).

You can import any compatible version of the ElementTree api using:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM