2016-12-30 6 views
1

У меня есть xml, который я проанализировал с помощью объективизации из вывода API, и я называю его переменной «result». Теперь я хочу o сохранить объект, но только изменить текстовый файл и вернуть его API для обновления элемента.Python lxml изменить xml объект дочерний текстовый атрибут

<field xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="multi_text_area"> 
    <id>1754</id> 
    <name>Devices under maintenance</name> 
    <read_only>false</read_only> 
    <text_area> 
    <text>defwhanld12x</text> 
    </text_area> 
</field> 

Когда я пытаюсь изменить текст, я получаю, как это, я получаю сообщение об ошибке:

result.text_area.text = 'This is a test' 

TypeError: attribute 'text' of 'ObjectifiedElement' objects is not writable

Я также попытался раздеть элемент и воссоздать его в качестве документации lxml говорит, что вы не можете изменить объект.

etree.strip_elements(result, 'text') 
etree.SubElement(result.text_area, 'text').text = 'This is just a test' 

Но получить подобную ошибку:

TypeError: attribute 'text' of 'StringElement' objects is not writable

ответ

1

Это потому, что элемент назван text. text также используется lxml.objectify для хранения внутреннего текста элемента, и именно так возник конфликт. Когда вы делаете result.text_area.text, это интерпретируется как попытка получить доступ к внутреннему тексту text_area вместо того, чтобы обращаться к дочернему элементу с именем text. Вы можете избежать этого конфликта путем доступа к text элемент следующим образом:

result.text_area['text'] = 'This is a test' 

UPDATE:

выше, оказалось, заменив весь <text> элемент с новым текстом, который в конечном итоге в качестве элемента в форме вы упомянули в комментарии ниже:

<text xmlns:py="http://codespeak.net/lxml/objectify/pytype" 
     py:pytype="str">This is a test</text> 

правильный способ обновить внутренний текст text элемента будет использовать _setText(), как указано в this other answer:

result.text_area['text']._setText('This is a test') 
+1

Спасибо большое, что сработало! Но мой ответ выглядит как '<поле Xmlns: XSI = "http://www.w3.org/2001/XMLSchema-instance" XSI: тип = "multi_text_area"> Устройство по обслуживанию ложного <текст XMLNS: ру = "http://codespeak.net/lxml/objectify/pytype" ру: pytype = "ул"> Это тест 'Я пытался лишить его подальше с 'etree.cleanup_namespaces (field.text_area ['text'])' , но это не сработало. – Empusas

+0

@Empusas см. ** ОБНОВЛЕНИЕ ** раздел выше .. – har07

 Смежные вопросы

  • Нет связанных вопросов^_^