Как написать амперсанд в узле приписать? - PullRequest
0 голосов
/ 14 апреля 2009

Мне нужно иметь следующее значение атрибута в моем узле XML:

CommandLine="copy $(TargetPath) ..\..\
echo dummy > dummy.txt"

На самом деле это часть файла .vcproj, созданного в VS2008. 
&#x0A означает разрыв строки, так как должно быть две отдельные команды.

Я использую Python 2.5 с minidom для анализа XML - но, к сожалению, я не знаю, как хранить последовательности вроде 
, лучшее, что я могу получить, это &amp#x0D;.

Как я могу хранить точно 
?

UPD: Собственно говоря, я должен хранить не &, а последовательность \ r \ n в виде & # x0D; & # x0A

Ответы [ 3 ]

1 голос
/ 14 апреля 2009

Я использую Python 2.5 с minidom для разбора XML - но, к сожалению, я не знаю, как хранить последовательности, подобные & # x0D;

Что ж, вы не можете указать, что вы хотите, чтобы шестнадцатеричные экранирования были конкретно, но в соответствии со стандартом DOM LS реализации должны заменять \ r \ n в значениях атрибута на ссылки на символы автоматически.

К сожалению, minidom не:

>>> from xml.dom import minidom
>>> document= minidom.parseString('<a/>')
>>> document.documentElement.setAttribute('a', 'a\r\nb')
>>> document.toxml()
u'<?xml version="1.0" ?><a a="a\r\nb"/>'

Это ошибка в минидоме. Попробуйте то же самое в другом DOM (например, pxdom ):

>>> import pxdom
>>> document= pxdom.parseString('<a/>')
>>> document.documentElement.setAttribute('a', 'a\r\nb')
>>> document.pxdomContent
u'<?xml version="1.0" ?><a a="a&#13;&#10;b"/>'
1 голос
/ 14 апреля 2009

Вы должны попытаться сохранить действительные символы (ASCII 13 и ASCII 10) в значении атрибута вместо их уже экранированных аналогов.


РЕДАКТИРОВАТЬ: похоже, minidom не обрабатывает новые строки в значениях атрибута правильно.

Хотя буквальный разрыв строки в значении атрибута разрешен, но он будет подвергаться нормализации при разборе документа, после чего он преобразуется в пробел.

Я подал ошибку в этом отношении: http://bugs.python.org/issue5752

0 голосов
/ 14 апреля 2009

Амперсанд - это специальный символ в XML, поэтому большинству анализаторов XML требуется действительный XML для работы. Позвольте minidom экранировать амперсанд для вас (на самом деле он уже должен быть экранирован), а затем, когда вам нужно отобразить экранированное значение, уберите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...