#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)