web-dev-qa-db-fra.com

Comment utiliser xmltodict pour extraire des éléments d'un fichier xml

J'essaie d'accéder facilement aux valeurs d'un fichier xml.

<artikelen>
    <artikel nummer="121">
        <code>ABC123</code>
        <naam>Highlight pen</naam>
        <voorraad>231</voorraad>
        <prijs>0.56</prijs>
    </artikel>
    <artikel nummer="123">
        <code>PQR678</code>
        <naam>Nietmachine</naam>
        <voorraad>587</voorraad>
        <prijs>9.99</prijs>
    </artikel>
..... etc

Si je veux accéder à la valeur ABC123, comment l'obtenir?

import xmltodict

with open('8_1.html') as fd:
    doc = xmltodict.parse(fd.read())
    print(doc[fd]['code'])
9
Sam Vruggink

En utilisant votre exemple:

import xmltodict

with open('artikelen.xml') as fd:
    doc = xmltodict.parse(fd.read())

Si vous examinez doc, vous verrez que c'est un OrderedDict, trié par tag:

>>> doc
OrderedDict([('artikelen',
              OrderedDict([('artikel',
                            [OrderedDict([('@nummer', '121'),
                                          ('code', 'ABC123'),
                                          ('naam', 'Highlight pen'),
                                          ('voorraad', '231'),
                                          ('prijs', '0.56')]),
                             OrderedDict([('@nummer', '123'),
                                          ('code', 'PQR678'),
                                          ('naam', 'Nietmachine'),
                                          ('voorraad', '587'),
                                          ('prijs', '9.99')])])]))])

Le nœud racine est appelé artikelen, et il y a un sous-nœud artikel qui est une liste d'objets OrderedDict, donc si vous voulez le code pour chaque article, vous feriez:

codes = []
for artikel in doc['artikelen']['artikel']:
    codes.append(artikel['code'])

# >>> codes
# ['ABC123', 'PQR678']

Si vous souhaitez spécifiquement le code uniquement lorsque nummer est 121, vous pouvez faire ceci:

code = None
for artikel in doc['artikelen']['artikel']:
    if artikel['@nummer'] == '121':
        code = artikel['code']
        break

Cela dit, si vous analysez des documents XML et souhaitez rechercher une valeur spécifique comme celle-ci, j'envisagerais d'utiliser expressions XPath , qui sont prises en charge par ElementTree.

15
Paul

Ceci utilise xml.etree Vous pouvez essayer ceci:

for artikelobj in root.findall('artikel'):
    print artikelobj.find('code')

si vous voulez extraire un code spécifique basé sur l'attribut 'nummer' d'artikel, alors vous pouvez essayer ceci:

for artikelobj in root.findall('artikel'):
    if artikel.get('nummer') == 121:
        print artikelobj.find('code')

cela n'imprimera que le code souhaité.

0
Chaitanya Sama