对要使用的XML处理选项感到困惑

时间:2011-06-22 17:14:44

标签: python xml dom elementtree minidom

我是Python的新手,我刚刚开始使用XML解析。我对使用XML的所有选项感到有些不知所措,我希望有经验的人可以为我正在处理的简单问题给我一些建议(也许是代码示例?)。

我正在开发一个不涉及数据库的简单Python联系人管理应用程序 - 每个联系人的信息都使用XML存储在单独的文本文件中。例如,假设以下是文件“1234.xml”

的内容
<contact>
<id>1234</id>
<name>Johnny Appleseed</name>
<phone>8145551212</phone>
<address>
    <street>1234 Main Street</street>
    <city>Hometown</city>
    <state>OH</state>
</address>
<address>
    <street>1313 Mockingbird Lane</street>
    <city>White Plains</city>
    <state>NY</state>
</address>
</contact>

为了举例,我们假设只有一个电话号码,但有多个地址块。

对于我在这里所做的事情,我需要能够从文件中解析XML,更改数据,然后更新XML并将其保存回文件。我们假设可能会发生三种类型的数据更改:

  1. 更改一个或多个项目的数据,例如更新电话号码

  2. 添加新地址块(以及新地址的街道/城市/州的相应数据)

  3. 删除现有地址栏

  4. 鉴于我在这里尝试做什么,你能推荐一种特殊的方法吗? (SAX,DOM,minidom,ElementTree,还有什么?)无论你建议什么样的代码样本都将不胜感激。

    谢谢!

    罗恩

2 个答案:

答案 0 :(得分:2)

最好的解决方案是使用ElementTree并将其解析为一组类并操作类,然后将它们序列化回XML。如果XML非常简单,您可以手动执行此操作,或者use some tool or library to generate the bindings

在大多数情况下,直接使用XML总是以泪水,或者至少是头发拉动为止。它也不是很易于维护,当XML发生变化时,它通常会破坏您的手动编码解析。

当您需要手动干预时,使用绑定解决方案对更改更加健壮并且更易于修改。

答案 1 :(得分:2)

SAX和DOM API较旧;它们几乎从Java世界翻译成Python。 ElementTree API专门设计为Pythonic,即符合Python解决问题的方式,所以更喜欢。

我所知道的最丰富,最快速的ElementTree实现是lxml。它的XPath功能非常有用。 未经测试示例:

from lxml import etree

contacts = etree.parse(open("1234.xml"))

for c in contacts.xpath('//contact'):
    if c.xpath('/name')[0].text == 'Johnny Appleseed':
        c.xpath('/phone')[0].text = NEW_PHONE_NUMBER

print >> open("1234.xml", "w"), etree.tostring(contacts)