Python 对使用哪个XML处理选项感到困惑

Python 对使用哪个XML处理选项感到困惑,python,xml,dom,elementtree,minidom,Python,Xml,Dom,Elementtree,Minidom,我对Python相当陌生,我刚刚开始使用XML解析。我对使用XML的所有选项都有点不知所措,我希望有经验的人能就我正在处理的简单问题给我一些建议(也许还有一个代码示例??) 我正在开发一个简单的Python联系人管理应用程序,它不涉及数据库——每个联系人的信息都使用XML存储在单独的文本文件中。例如,假设以下是文件“1234.xml”的内容 1234 撒播希望种子的约翰尼 8145551212 大街1234号 家乡 哦 模仿鸟巷1313号 白色平原 纽约 例如,假设只有一个电话号码,但有多个

我对Python相当陌生,我刚刚开始使用XML解析。我对使用XML的所有选项都有点不知所措,我希望有经验的人能就我正在处理的简单问题给我一些建议(也许还有一个代码示例??)

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


1234
撒播希望种子的约翰尼
8145551212
大街1234号
家乡
哦
模仿鸟巷1313号
白色平原
纽约
例如,假设只有一个电话号码,但有多个地址块

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

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

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

  • 删除现有地址块

  • 考虑到我在这里要做的,你能推荐一种特别的方法吗?(SAX、DOM、minidom、ElementTree等?)如能提供您所建议的代码示例,将不胜感激

    谢谢大家!


    Ron

    最好的解决方案是使用
    ElementTree
    并将其解析为一组类,操作这些类,然后将它们序列化回XML。如果XML真的像您的示例一样简单,或者您可以手动执行此操作

    在大多数情况下,直接使用XML总是以眼泪告终,或者至少是毛骨悚然。它也不是很容易维护,当XML发生变化时,它通常会破坏手工编码的解析


    使用绑定解决方案将对更改更具鲁棒性,并且在确实需要手动干预时更易于修改。

    SAX和DOM API较旧;它们基本上是从Java世界翻译成Python的。ElementTreeAPI是专为Python而设计的,也就是说,它适合Python解决问题的方式,所以我们更喜欢这种方式

    据我所知,ElementTree最丰富、最快的实现是。它的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)
    

    非常感谢。在安装了XCode和lxml(比在Mac上更难…)之后,我能够很好地运行这个版本。这是我的第一个问题,我很高兴得到了快速的回答!
    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)