Разбор XML Python с помощью xmltodict - PullRequest
0 голосов
/ 08 марта 2019

Мне нужно извлечь информацию из различных XML-файлов в каталоге.Все они имеют одинаковую структуру, но могут иметь различное количество значений, хранящихся в паре "" / пара.Я использую xmltodict для доступа к другой паре "значения" / пара и хранить их в dict.К сожалению, xml выглядит примерно так:

<license xmlns:="http://www.example.com">
    <application name="TEST">
        <operation>
            <condition implication="stop" name="module">
                <arguments>
                    <pair key="version">1</pair>
                </arguments>
            </condition>
            <condition implication="stop" name="allowed">
                <arguments>
                    <pair key="commandName">value1</pair>
                    <pair key="commandName">value2</pair>
                    <pair key="commandName">value3</pair>
                    <pair key="commandName">value4</pair>
                </arguments>
            </condition>
        </operation>
     </application>
</applications>

Это определенно не лучшее решение, но я новичок, и мне нужно сделать эту работу.Мой код выглядит примерно так

if application['@name'] == "Test":
   for pair in application['operation']['condition'][1]['arguments']:
       if pair["@key"]["#text"] == 'value1':
          value1 = 'available'
       if pair["@key"]["#text"] == 'value2':
          value2 = 'available'
....
Test_dict = {'value1': value1, 'value2': value2....}

И это мой вывод:

if pair["@key"]["#text"] == 'value1':

TypeError: string indices must be integers

Как мне заставить это работать?


РЕДАКТИРОВАТЬ:

Я снова, все еще пытаюсь разобраться с этим.

Jonathans Solution работает для всех сценариев, кроме одного, где у меня есть только одно значение пары.например:

<license xmlns:="http://www.example.com">
    <application name="TEST">
        <operation>
            <condition implication="stop" name="module">
                <arguments>
                    <pair key="version">1</pair>
                </arguments>
            </condition>
            <condition implication="stop" name="allowed">
                <arguments>
                    <pair key="commandName">value1</pair>
                </arguments>
            </condition>
        </operation>
     </application>
</license>

Я все еще получаю то же сообщение об ошибке.

if pair["#text"] == 'value2': TypeError: string indices must be integers

Пока существует более одного значения пары, этот подход работает отлично.Любой подход, как это исправить?

1 Ответ

1 голос
/ 08 марта 2019

Вы получаете эту ошибку, потому что обрабатываете строковое значение внутри pair["@key"] как диктовку.

Попробуйте использовать if pair["#text"] == 'value1':, и оно должно работать.

Полный код, который работает для меня:

import xmltodict

xml = """
    <application name="TEST">
        <operation>
            <condition implication="stop" name="module">
                <arguments>
                    <pair key="version">1</pair>
                </arguments>
            </condition>
            <condition implication="stop" name="allowed">
                <arguments>
                    <pair key="commandName">value1</pair>
                    <pair key="commandName">value2</pair>
                    <pair key="commandName">value3</pair>
                    <pair key="commandName">value4</pair>
                </arguments>
            </condition>
        </operation>
     </application>
"""

d = xmltodict.parse(xml)

if d['application']['@name'] == "TEST":
    for pair in d['application']['operation']['condition'][1]['arguments']['pair']:
        if pair["#text"] == 'value1':
            value1 = 'available'
        if pair["#text"] == 'value2':
            value2 = 'available'

print(value1, value2)
...