关于python:从XML文件获取JSON字典

Get a json dictionary from xml file

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
easiest way to parse xml in python

我需要解析一个看起来像XML文件但没有XML声明的文件。

以下是XML文件的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
<connection name="name_1">
  <parameter name="user" value="user_value_1"/>
  <parameter name="password" value="psw_1"/>
</connection>
<connection name="name_2">
  <parameter name="user" value="user_value_2"/>
  <parameter name="password" value="psw_2"/>
</connection>

<connection name="name_n">
  <parameter name="user" value="user_value_n"/>
  <parameter name="password" value="psw_n"/>
</connection>

我的问题是,我可以使用哪些库来解析当前文件?

实际上,给定当前文件,如何获得输出:


{"connection names":["name_1","name_2",…,"name_n"]}

谢谢,

安东尼奥


XML无效,无法正确分析,因为它不包含主元素。以下是有效版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<connections>
  <connection name="name_1">
    <parameter name="user" value="user_value_1"/>
    <parameter name="password" value="psw_1"/>
  </connection>

  <connection name="name_2">
    <parameter name="user" value="user_value_2"/>
    <parameter name="password" value="psw_2"/>
  </connection>

  <connection name="name_n">
    <parameter name="user" value="user_value_n"/>
    <parameter name="password" value="psw_n"/>
  </connection>
</connections>

您可以使用minidom来解析它。是的,对于很多元素来说,速度有点慢,但我禁不住使用了一些类似于javascript的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from xml.dom.minidom import parseString

document = parseString('''
<?xml version="1.0"?>
<connections>
  <connection name="name_1">
    <parameter name="user" value="user_value_1"/>
    <parameter name="password" value="psw_1"/>
  </connection>

  <connection name="name_2">
    <parameter name="user" value="user_value_2"/>
    <parameter name="password" value="psw_2"/>
  </connection>

  <connection name="name_n">
    <parameter name="user" value="user_value_n"/>
    <parameter name="password" value="psw_n"/>
  </connection>
</connections>'''
)

names = {'connection names': []}

for connection in document.getElementsByTagName('connection'):
  names['connection names'].append(connection.getAttribute('name'))

print names

输出为:

1
 {'connection names': [u'name_1', u'name_2', u'name_n']}