LXML python: Как изменить каждый экземпляр элемента

#python #python-3.x #lxml

Вопрос:

Как бы я изменил каждый элемент Weather_ID в следующем, используя LXML и Python?

Как вы можете видеть, я в основном пытаюсь установить для каждого Weather_Id новое значение, в данном случае это значение равно 5.

В моем примере реального мира могут быть десятки и сотни WEATHER_ID.

 <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<ProjectDataSet>
<Fx>
    <Id>1</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
<Fx>
    <Id>2</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
    <Fx>3<Id>3</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
<Fx>
    <Id>4</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
</ProjectDataSet>
 

То, что я пробовал до сих пор:

 from lxml import etree

text = """
<ProjectDataSet>
<Fx>
    <Id>1</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
<Fx>
    <Id>2</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
    <Fx>3<Id>3</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
<Fx>
    <Id>4</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
</ProjectDataSet>
"""

root= etree.fromstring(text)


newWeatherId = 5

targets = root.xpath("//Fx[./Weather_Id]")
print(targets)
for target in targets:
    target.text = str(newWeatherId)

 

Мне кажется, что я либо не изменяю список, не изменяю значение тегов Weather_Id, либо создаю различные ошибки, потому что я неправильно обращаюсь к тексту.

Ответ №1:

Вы близки, вам просто нужно правильно настроить xpath. Также почему бы не напечатать root ?

 from lxml import etree

text = """
<ProjectDataSet>
<Fx>
    <Id>1</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
<Fx>
    <Id>2</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
<Fx>
    3
    <Id>3</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
<Fx>
    <Id>4</Id>
    <Weather_Id>2</Weather_Id>
    <Other></Other>
</Fx>
</ProjectDataSet>
"""

root= etree.fromstring(text)
newWeatherId = 5
targets = root.xpath("//Fx/Weather_Id")

for target in targets:
    target.text = str(newWeatherId)

print(etree.tostring(root))
 

Комментарии:

1. Большое спасибо. Я тоже пробовал в этом направлении, но по какой-то причине не смог заставить его работать.

Ответ №2:

В конце концов, именно такой подход был принят. Неэффективно, но функционально.

 curWxID = 5

fxNumber = root.xpath('//Fx/Weather_Id')
            if fxNumber:
                length = len(fxNumber)
                for i in range(length):
                    fxNumber[i].text = str(curWxID)