Python XML解析

9
*注意:lxml不能在我的系统上运行。我希望找到一种不涉及lxml的解决方案。
我已经浏览了一些相关文档,但是在尝试实现自己的想法时遇到了困难。我想解析一个类似于以下结构的XML文件:
<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并输出一个文本/数据文件,看起来像这样:
1375,“一些字符串”,“另一个字符串”,“仍然是另一个字符串”,“任何人都可以用字符串”

Eof
最初,我尝试使用lxml,但在我的系统上尝试了很多次后,我转而使用DOM。最近,我尝试使用Etree完成这个任务。请好心人帮助我完成这个任务吧!我相对较新于Python,并希望学习如何实现它。提前感谢您。

1
什么操作系统和Python版本? - Acorn
你有两个1375的数字。它们可以是两个不同的数字吗?如果可以,你想要哪一个? - John Machin
2个回答

10
您可以使用Python自带的xml.etree.ElementTree。附带一个C实现的伴侣(即更快速的)xml.etree.cElementTreelxml.etree提供了一个超集功能,但它对你想要做的事情不是必需的。
@Acorn提供的代码对于我来说(Python 2.7,Windows 7)在以下每个导入中都是相同的:
import xml.etree.ElementTree as et
import xml.etree.cElementTree as et
import lxml.etree as et
...
tree = et.fromstring(xmltext)
...

你使用的操作系统是什么?在安装lxml时遇到了什么问题?


我正在使用Ubuntu Maverick Meerkat Netbook安装...最新的lxml安装尝试在我的终端中包含了这个消息:正在解压python-lxml(来自.../python-lxml_2.2.6-1_i386.deb)... 设置固件-b43-installer(4.150.10.5-4)... 不支持PCI id 14e4:4315的低功率芯片! 中止。 - PleaseHelpTheNewGuy
我刚刚尝试了新的导入代码,但出现了以下错误:Traceback (most recent call last): File "/home/worky.py", line 5, in <module> import lxml.etree as et ImportError: No module named lxml.etree - PleaseHelpTheNewGuy
(1) 关于您的Ubuntu安装问题:我建议您尝试lxml邮件列表。 (2) "没有名为lxml.etree的模块" ...那是因为它没有被安装。一次只能有一个导入处于活动状态;注释掉其他两个。 - John Machin
好的,约翰,谢谢你的帮助,我正在调试代码...也许我可以用这段代码解决问题,但它并不完全符合我的需求...如果我能让它正常工作,那就是我需要的了。感谢你的建议。 - PleaseHelpTheNewGuy

7
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)

1
你正在使用哪个操作系统? - Acorn
我正在运行Ubuntu Maverick Meerkat Netbook版... - PleaseHelpTheNewGuy
你是如何尝试安装它的?你是否尝试使用PIP进行安装? - Acorn
好的,嗯... 当我尝试安装安装lxml所需的东西时,仍然会出现相同的错误。这就是为什么我希望能找到一种不使用lxml解析XML的解决方案的原因。 - PleaseHelpTheNewGuy
@PleaseHelpTheNewGuy:我已经给你提供了解决方案:xml.etree.[c]ElementTree。 - John Machin
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接