Мне нужна помощь, управляющая значениями в файле XML с помощью Python.
XML выглядит так, но с еще большим количеством растений:
<CATALOG>
<PLANT>
<COMMON>Bloodroot</COMMON>
<BOTANICAL>Sanguinaria canadensis</BOTANICAL>
<ZONE>4</ZONE>
<LIGHT>Mostly Shady</LIGHT>
<PRICE>2.44</PRICE>
<AVAILABILITY>031599</AVAILABILITY>
</PLANT>
<PLANT>
<COMMON>Columbine</COMMON>
<BOTANICAL>Aquilegia canadensis</BOTANICAL>
<ZONE>3</ZONE>
<LIGHT>Mostly Shady</LIGHT>
<PRICE>9.37</PRICE>
<AVAILABILITY>030699</AVAILABILITY>
</PLANT>
<PLANT>
<COMMON>Marsh Marigold</COMMON>
<BOTANICAL>Caltha palustris</BOTANICAL>
<ZONE>4</ZONE>
<LIGHT>Mostly Sunny</LIGHT>
<PRICE>6.81</PRICE>
<AVAILABILITY>051799</AVAILABILITY>
</PLANT>
</CATALOG>
Мне нужно изменить значение на основе значения.
У меня это до сих пор:
if tree.find('.//COMMON').text == 'Bloodroot':
tree.find('.//PRICE').text = '3.50'
Этот код работает, но это только потому, что это первый блок. Если я это сделаю, ничего не произойдет:
if tree.find('.//COMMON').text == 'Columbine':
tree.find('.//PRICE').text = '3.50'
Может ли кто-нибудь указать мне правильное направление здесь? Как изменить значения цены для всех заводов на основе значения "COMMON". Я также пробовал некоторые другие вещи с циклом через XML файл без везения.
Спасибо!
Как говорит документация для find, она останавливается на первом найденном узле. Вам нужно выполнить итерацию по родительскому узлу, чтобы найти все из них, и проверить значение. Вот пример.
from xml.etree import ElementTree
with open("data.xml", "rb") as fo:
root = ElementTree.parse(fo)
for plantnode in root.findall("PLANT"):
if plantnode.find("COMMON").text == "Columbine":
pricenode = plantnode.find("PRICE")
print(pricenode.text)
pricenode.text = '3.50'
print(pricenode.text)