Как изменить значения узла в xml, используя xpath с for for (python)?

1

Я делаю проект XML, где я пытаюсь реализовать некоторые коды с использованием Python.

Я пытаюсь получить список текстовых узлов (//text()) с помощью xpath и изменить значения в цикле for, но он не обновляется в конечном выводе. Пожалуйста, помогите мне исправить код, чтобы изменить значения текстовых узлов.

from lxml import etree
xml = "<main><a>y<b>x</b><c><d>x</d></c></a></main>"
root = etree.fromstring(xml)
nodeList = root.xpath('//text()')
for c in nodeList:
    c = "test"    
print (etree.tostring(root))

Output: 
<main><a>y<b>x</b><c><d>x</d></c></a></main>
Теги:
xpath
lxml

1 ответ

0
Лучший ответ

Каждый элемент nodeList представляет собой специальный тип строки ( _ElementStringResult). Строки являются неизменяемыми, поэтому невозможно присвоить новые значения.

Вот код, который работает (он также учитывает свойство tail):

from lxml import etree

xml = "<main><a>y<b>x</b>x<c><d>x</d>y</c></a></main>"
root = etree.fromstring(xml)

for node in root.iter():
    if node.text:
        node.text = "test"
    if node.tail:
        node.tail = "TAIL"

print(etree.tostring(root).decode())

Выход:

<main><a>test<b>test</b>TAIL<c><d>test</d>TAIL</c></a></main>
  • 0
    Большое спасибо, это действительно удивительно, я всегда использую C # для обработки XML, но сейчас я изучаю Python для нужд проекта, вы спасли мой день.
  • 0
    приведенный выше код работает хорошо, но он пропускает следующие примеры. Вход: xml = "<main> <a> y <b> x </ b> x <c> <d> x </ d> y </ c> </a> </ main>" output: b ' <главная> <a> тест <б> тест </ б> х <с> <д> тест </ д> у </ с> </a> </ главная>»
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню