我需要从目录中的各种xml文件中提取信息。它们都有相同的结构,但可能有不同数量的值存储在对“/pair”中。我使用xmltodict访问不同对的“值”/pair,并将它们存储在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的解决方案适用于所有场景,但只有一对值的情况除外。例如:
<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只要有多对值,这种方法就能很好地工作。有办法解决这个问题吗?
发布于 2019-03-08 10:29:33
您将得到该错误,因为您将pair["@key"]中的字符串值视为dict。
尝试使用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)https://stackoverflow.com/questions/55060921
复制相似问题