Найти и отредактировать подэлемент в XML с помощью Python ElementTree
Поскольку файл XML, с которым я имею дело, содержит несовместимые подэлементы, у меня возникают некоторые трудности с поиском и редактированием определенного подэлемента, который не появляется в серии элементов, пока не будет дальше в файле. Я использую ElementTree Python, включенный в Python 2.7.1.
Вот пример типа 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' и изменить стерео ='Sony' на 'Blaupunkt'.
Если я использую ElementTree для поиска атрибута "стерео", он выдает ошибку, потому что "стерео" не содержится в элементах в верхней части файла.
Любая помощь или советы будут с благодарностью.
1 ответ
Используйте простое выражение 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"
и stereo
приписывать.