0

我需要从目录中的各种 xml 文件中提取信息。它们都具有相同的结构,但可能在对“”/pair 中存储不同数量的值。我正在使用 xmltodict 访问不同的对“值”/pair 并将它们存储在一个字典中。不幸的是,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 解决方案适用于所有情况,除了我只有一对值的情况。例如:

<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

只要有不止一对值,这种方法就可以很好地工作。关于如何解决这个问题的任何方法?

4

1 回答 1

1

您收到该错误是因为您将内部的字符串值视为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)
于 2019-03-08T10:29:33.953 回答