2017-05-18 54 views
0

这是我使用的XML文件:打印XML字段作为字典

<fields> 
<input_layer name = "Pocket_Substation"/> 
<output_layer name = "sub_substation"/> 
<field_mapping> 
    <field input_name = "dat" output_name="date" /> 
    <field input_name = "Type" output_name="type"/> 
    <field input_name = "Class" output_name="class"/> 
    <field input_name = "Land" output_name="land"/> 
    <field input_name = "status" output_name="status"/> 
    <field input_name = "descrp" output_name="description"/> 
    <field input_name = "Loc" output_name="location"/> 
    <field input_name = "voltage" output_name="voltage"/> 
    <field input_name = "name" output_name="owner_name"/> 
    <field input_name = "Remarks" output_name="remarks"/> 
</field_mapping> 
</fields> 

我需要在字典格式的字段值(output_name中:input_name)。下面是我的代码打印的字典,而是程序返回

unhashable type: 'list' error. 

下面是代码:

import xml.etree.ElementTree as ET 

def read_field(xml_node, name): 
    return [child.get(name) for child in xml_node.iter('field')] 

def read_map(xml_node): 
    fields = dict() 

    for child in xml_node: 
     if child.tag == 'field_mapping': 
      fields = {field_name : read_field(child, field_name) for field_name 
       in ['input_name','output_name']} 

      return{ 
       fields['input_name']:fields['output_name'] 
       } 

tree = ET.parse('substation.xml') 
root = tree.getroot() 
print(read_map(root)) 

回答

0

这行是问题:return { fields['input_name']:fields['output_name'] }

这说“返回一个字典含一个关键字等于输入名称列表并且值等于输出名称列表的单个条目“。 Python然后抱怨,因为列表不能是一个字典密钥。

你大概想要做的是返回一个将输入名称映射到输出名称的字典。要做到这一点,将两个列表压缩在一起(创建一个元组列表),然后将其转换为字典,将每个元组解释为键/值对。

所以用以下内容替换上述行:

return dict(zip(fields['input_name'],fields['output_name']))

+0

是的,它的工作。谢谢@David Scarlett –

0

你太很快完成执行,试试这个:

def read_map(xml_node): 
    result = {} 
    for child in xml_node: 
     result[child.get('output_name') ] = child.get('input_name') 
    return result 

tree = ET.parse('substation.xml') 
root = tree.getroot() 
print(read_map(root.find('field_mapping'))) 
+0

号它不工作。以下同样的错误。 –

+0

让我改变我的代码,因为你已经更新了问题的一些部分 – VMRuiz