2011-06-22 29 views
3

我對Python相當陌生,並且剛開始使用XML解析。我對使用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. 刪除現有地址塊

鑑於我試着克在這裏做,你能推薦一個特殊的方式來做到這一點? (SAX,DOM,minidom,ElementTree,別的東西?)代碼示例爲您的建議將不勝感激。

謝謝!

羅恩

回答

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

謝謝!在安裝了XCode和lxml之後(比Mac本來的應用程序更難......),我能夠得到一個很好的版本。這是我的第一個stackoverflow問題,我很高興快速響應! –

2

最好的解決方案是使用ElementTree和解析成一組類本和操作類,然後它們序列化回XML。如果XML與您的示例一樣簡單,或者您可以使用use some tool or library to generate the bindings,則可以親手操作。

在大多數情況下直接使用XML通常會以淚水結束,或者至少是拉動頭髮。它也不是很好維護,當XML改變時它通常會打破你的手編碼解析。

使用綁定解決方案將對更改更健壯,並且在需要手動干預時更易於修改。

+0

謝謝!我使用了lxml實現,它工作得很好。 –