web-dev-qa-db-fra.com

Comment extraire un attribut xml en utilisant Python ElementTree

Pour:

<foo>
 <bar key="value">text</bar>
</foo>

Comment obtenir de la "valeur"?

xml.findtext("./bar[@key]")

Lance une erreur.

29
Will Curran

Cela trouvera la première instance d'un élément nommé bar et renverra la valeur de l'attribut key.

In [52]: import xml.etree.ElementTree as ET

In [53]: xml=ET.fromstring(contents)

In [54]: xml.find('./bar').attrib['key']
Out[54]: 'value'
43
unutbu

Obtention de la valeur d'attribut de la balise enfant dans un XML en utilisant ElementTree

Analysez le fichier XML et obtenez la balise root, puis utilisez [0] nous donnera le premier tag enfant. De même [1], [2] nous donne les balises enfant suivantes. Après avoir obtenu la balise enfant, utilisez .attrib[attribute_name] pour obtenir la valeur de cet attribut.

>>> import xml.etree.ElementTree as ET
>>> xmlstr = '<foo><bar key="value">text</bar></foo>'
>>> root = ET.fromstring(xmlstr)
>>> root.tag
'foo'
>>> root[0].tag
'bar'
>>> root[0].attrib['key']
'value'

Si le contenu xml est dans un fichier. Vous devriez faire la tâche ci-dessous pour obtenir le root.

>>> tree = ET.parse('file.xml')
>>> root = tree.getroot()
2
rashok

Votre expression:

./bar[@key]

Cela signifie: bar enfants ayant l'attribut key

Si vous souhaitez sélectionner l'attribut, utilisez cette expression relative:

bar/@key

Cela signifie: l'attribut key des enfants bar

Bien sûr, vous devez envisager d'utiliser un moteur XPath entièrement conforme comme lxml .

1
user357812

En suivant la méthode, vous pouvez obtenir tous les attributs de xml (dans le dictionnaire)

import xml.etree.ElementTree as etree
xmlString= "<feed xml:lang='en'><title>World Wide Web</title><subtitle lang='en'>Programming challenges</subtitle><link rel='alternate' type='text/html' href='http://google.com/'/><updated>2019-12-25T12:00:00</updated></feed>"
xml= etree.fromstring(xmlString)  

def get_attr(xml):
    attributes = []
    for child in (xml):
        if len(child.attrib)!= 0:
            attributes.append(child.attrib)
        get_attr(child)
    return attributes
attributes = get_attr(xml)

print(attributes)
0
Dipen Parmar