python XML解析

Python XML Parsing

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

*注意:LXML不会在我的系统上运行。我希望找到一个不涉及LXML的解决方案。

我已经阅读了这里的一些文档,并且很难按照我的意愿完成这些工作。我想分析一些如下所示的XML文件:

1
2
3
4
5
6
7
8
9
10
<dict>
    <key>1375</key>
    <dict>
        <key>Key 1</key><integer>1375</integer>
        <key>Key 2</key><string>Some String</string>
        <key>Key 3</key><string>Another string</string>
        <key>Key 4</key><string>Yet another string</string>
        <key>Key 5</key><string>Strings anyone?</string>
    </dict>
</dict>

在我试图操作的文件中,有更多的"dict"跟在后面。我想通读XML并输出如下所示的文本/DAT文件:

1375,"一些字符串","另一个字符串","还有另一个字符串","字符串任何人?"

EOF

**最初,我尝试使用lxml,但在多次尝试让它在我的系统上工作之后,我继续使用dom。最近,我尝试使用etree来完成这项任务。求求你,为了所有美好的事物的爱,有人能帮我吗?我对python比较陌生,想了解一下它是如何工作的。我提前感谢你。


可以使用Python附带的xml.etree.elementtree。有一个附带的C实现(即更快)的xml.etree.cElementTreelxml.etree提供了功能的超集,但您不需要这样做。

@acorn提供的代码对我(python 2.7,windows 7)的工作方式是相同的,每种导入方式如下:

1
2
3
4
5
6
import xml.etree.ElementTree as et
import xml.etree.cElementTree as et
import lxml.etree as et
...
tree = et.fromstring(xmltext)
...

您使用的是什么操作系统?您在lxml上遇到了哪些安装问题?


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
28
29
30
31
32
33
import xml.etree.ElementTree as et
import csv

xmltext ="""
<dicts>
    <key>1375</key>
    <dict>
        <key>Key 1</key><integer>1375</integer>
        <key>Key 2</key><string>Some String</string>
        <key>Key 3</key><string>Another string</string>
        <key>Key 4</key><string>Yet another string</string>
        <key>Key 5</key><string>Strings anyone?</string>
    </dict>
</dicts>
"""


f = open('output.txt', 'w')

writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)

tree = et.fromstring(xmltext)

# iterate over the dict elements
for dict_el in tree.iterfind('dict'):
    data = []
    # get the text contents of each non-key element
    for el in dict_el:
        if el.tag == 'string':
            data.append(el.text)
        # if it's an integer element convert to int so csv wont quote it
        elif el.tag == 'integer':
            data.append(int(el.text))
    writer.writerow(data)