我是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并将其保存回文件。我们假设可能会发生三种类型的数据更改:
更改一个或多个项目的数据,例如更新电话号码
添加新地址块(以及新地址的街道/城市/州的相应数据)
删除现有地址栏
鉴于我在这里尝试做什么,你能推荐一种特殊的方法吗? (SAX,DOM,minidom,ElementTree,还有什么?)无论你建议什么样的代码样本都将不胜感激。
谢谢!
罗恩
答案 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)