Управление XML с помощью Python - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужна помощь в манипулировании значениями в файле 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'

Может ли кто-нибудь указать мне правильное направление здесь?Как изменить значения цены для всех заводов на основе значения «ОБЩИЕ».Я также пробовал разные вещи с циклическим просмотром XML-файла, но безуспешно.

Спасибо!

1 Ответ

0 голосов
/ 24 сентября 2018

Как сказано в документации для 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...