使用Python ElementTree查找和编辑XML子元素

3 投票
1 回答
4258 浏览
提问于 2025-04-17 17:46

因为我正在处理的XML文件里面的子元素不太一致,所以我在找到并编辑一个特定的子元素时遇到了一些困难。这个子元素在文件的后面才出现,而不是在前面。我使用的是Python 2.7.1自带的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'这个元素。

如果有人能提供帮助或提示,我将非常感激。

1 个回答

3

使用一个简单的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表达式,包括只匹配id="Volkswagen"model元素和带有stereo属性的元素。

撰写回答