Найти и отредактировать подэлемент в 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 приписывать.

Другие вопросы по тегам