首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用xmltodict解析Python

用xmltodict解析Python
EN

Stack Overflow用户
提问于 2019-03-08 10:08:32
回答 1查看 555关注 0票数 0

我需要从目录中的各种xml文件中提取信息。它们都有相同的结构,但可能有不同数量的值存储在对“/pair”中。我使用xmltodict访问不同对的“值”/pair,并将它们存储在dict中。不幸的是,xml看起来有点像这样:

代码语言:javascript
复制
<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>

这绝对不是最好的解决方案,但我是一个完全的初学者,需要使这个工作。我的代码看起来像这样

代码语言:javascript
复制
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....}

这是我的输出:

代码语言:javascript
复制
if pair["@key"]["#text"] == 'value1':

TypeError: string indices must be integers

我怎么才能让这个起作用?

编辑:

我又来了,还在努力想办法解决这个问题。

Jonathans的解决方案适用于所有场景,但只有一对值的情况除外。例如:

代码语言:javascript
复制
<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>

我仍然收到同样的错误信息。

代码语言:javascript
复制
if pair["#text"] == 'value2': TypeError: string indices must be integers

只要有多对值,这种方法就能很好地工作。有办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2019-03-08 10:29:33

您将得到该错误,因为您将pair["@key"]中的字符串值视为dict。

尝试使用if pair["#text"] == 'value1':,它应该可以工作。

适用于我的完整代码:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55060921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档