Как записать неэкранированную строку в элемент XML с ElementTree? - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть строковая переменная contents со следующим значением:

<ph type="0" x="1"></ph>

Я пытаюсь записать его в элемент XML следующим образом:

elemen_ref.text = contents

После того, как я напишу дерево XMLв файл и проверьте его с помощью Notepad ++, я вижу следующее значение, записанное в элемент XML:

&lt;ph type="0" x="1"&gt;&lt;/ph&gt;

Как мне написать неэкранированную строку?Обратите внимание, что это значение копируется из другого элемента XML, который остается неизменным после записи дерева в файл, поэтому проблема заключается в присвоении значения атрибуту text.

1 Ответ

0 голосов
/ 09 декабря 2018

Вы пытаетесь сделать это:

import xml.etree.ElementTree as ET

root = ET.Element('root')
content_str = '<ph type="0" x="1"></ph>'
root.text = content_str

print(ET.tostring(root))
#  <root>&lt;ph type="0" x="1"&gt;&lt;/ph&gt;</root>

По сути, это «внедрение» XML в свойство text элемента.Это не правильный способ сделать это.

Вместо этого вам следует преобразовать строку content в фактический узел XML, который можно добавить к существующему узлу XML.

import xml.etree.ElementTree as ET

root = ET.Element('root')
content_str = '<ph type="0" x="1"></ph>'
content_element = ET.fromstring(content_str)
root.append(content_element)

print(ET.tostring(root))
#  <root><ph type="0" x="1" /></root>

Если вы настаиваете, вы можете использовать unescape:

import xml.etree.ElementTree as ET
from xml.sax.saxutils import unescape

root = ET.Element('root')
content_str = '<ph type="0" x="1"></ph>'
root.text = content_str

print(unescape(ET.tostring(root).decode()))
#  <root><ph type="0" x="1"></ph></root>
...