2013-03-03 64 views
2

因爲我正在處理的XML文件有不一致的子元素,所以我在查找和編輯特定的子元素時遇到了一些困難,這些子元素不會出現在一系列元素中,直到進一步向下文件。 我正在使用Python 2.7.1中包含的Python ElementTree。使用Python查找和編輯子元素ElementTree

這裏是我處理XML文件的類型的示例:

<?xml vin="1.0" encoding="UTF-8" standalone="yes"?> 

<whatever id='Subaru' YouCanDriveMyCar='Wednesday' transmission='stick'> 
     <model id='Ford' year='1972'>A</model> 
     <model id='Chevrolet' vin="1234567890" stereo='Alpine' airconditioning='notworking'>Volt</model> 
     <model id='Dodge' vin="3456789012" airconditioning='working'>Durango</model> 
     <model id='Mercedes' vin="4567890123" airconditioning='none'>S150</model> 
     <model id='BMW'>M350</model> 
     <model id='Volkswagen' vin="56789" stereo='Sony'>Beetle</model> 
     <model id='Honda' vin="6789" airconditioning="blowsicecubes">Accord</model> 
</whatever> 

在這個例子中,我想找到模型ID =「大衆」和改變立體聲=「索尼」到「藍寶」。

如果我使用ElementTree來搜索'stereo'屬性,它將會出錯,因爲'stereo'不包含在文件頂部的元素中。

任何幫助或提示將不勝感激。

回答

2

使用簡單的XPath表達式來找到合適的型號:

volkswagen = tree.find('.//model[@id="Volkswagen"]') 

然後簡單地調整stereo屬性:

volkswagen.set('stereo', 'Blaupunkt') 

你也可以搜索具有stereo屬性model元素:

models_with_stereos = tree.findall('.//model[@stereo]') 

然後進一步過濾在那些元素上。

如果切換到使用lxml(備選實現了ElementTree API的),可以使用更復雜的XPath表達式仍然,包括僅匹配modelid="Volkswagen"元件和stereo屬性。

+0

@ J.F.Sebastian:謝謝你的提醒。 – 2013-03-03 18:16:35

+0

非常感謝Martijn!它的工作讓我更接近解決方案。我正在開發一個Windows平臺,並研究了lxml,但看起來Windows正確地配置lxml有點麻煩。一旦我有更多的時間,我一定會看看lxml。目前,您的解決方案正常工作!再次感謝。 – 2013-03-03 18:29:09

相關問題