因为我正在处理的XML文件具有不一致的子元素,所以我在查找和编辑特定的子元素时遇到了一些困难,这些子元素在该文件的下一部分中没有出现。 我正在使用Python 2.7.1中包含的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="5678901234" stereo='Sony'>Beetle</model>
<model id='Honda' vin="6789012345" airconditioning="blowsicecubes">Accord</model>
</whatever>
在这个例子中,我想找到模型id ='Volkswagen'并将stereo ='Sony'改为'Blaupunkt'。
如果我使用ElementTree搜索属性'stereo',则会出错,因为'stereo'不包含在文件顶部的元素中。
非常感谢任何帮助或提示。
答案 0 :(得分:2)
使用简单的XPath表达式来查找正确的模型:
volkswagen = tree.find('.//model[@id="Volkswagen"]')
然后只需调整stereo
属性:
volkswagen.set('stereo', 'Blaupunkt')
您还可以使用model
属性搜索stereo
元素:
models_with_stereos = tree.findall('.//model[@stereo]')
然后进一步过滤这些元素。
如果切换到使用lxml
(ElementTree API的替代实现),您仍可以使用更复杂的XPath表达式,包括仅将model
个元素与id="Volkswagen"
和{{{ 1}}属性。