Как сохранить новые строки в атрибуте XML?


Мне нужно сохранить содержимое, содержащее новые строки в некоторых атрибутах XML, а не текст. Метод должен быть выбран так, чтобы я мог декодировать его в XSLT 1.0/ESXLT/XSLT 2.0

каков наилучший метод кодирования?

прошу подсказать/дать некоторые идеи.

3 51

3 ответа:

в совместимом DOM API вам ничего не нужно делать. Просто сохраните фактические символы новой строки в атрибуте, API будет правильно кодировать их самостоятельно (см. каноническая спецификация XML, раздел 5.2).

если вы делаете свою собственную кодировку (т. е. замена \n С 
 перед сохранением значения атрибута), API будет кодировать ваш ввод снова, в результате 
 в XML-файле.

нижняя строка, строковое значение сохраняется дословный. Вы получите то, что вы положили, не нужно вмешиваться.

... некоторые реализации не совместимы. Например, они будут кодировать & символы в значениях атрибутов, но забывают о символы новой строки или табуляции. Это ставит вас в проигрышную позицию, так как вы не можете просто заменить новые строки на 
 заранее.

эти реализации сохранят символы новой строки некодированными, например:

<xml attribute="line 1
line 2" />

при разборе таких документ, буквальный перевод строк в атрибутах нормализуются в единое пространство (опять же, в соответствии со спецификацией) - и таким образом они потеряны.

сохранение (и сохранение!) новые строки в атрибутах невозможны в этих реализациях.

вы можете использовать объект &#10; для представления новой строки в атрибуте XML. &#13; может использоваться для представления возврата каретки. CRLF стиля windows может быть представлен как &#13;&#10;.

это законный синтаксис XML. Смотрите XML spec для более подробной информации.

грубый ответ может быть:

XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"Agenda.xml");
//make stuff with the xml
//make attributes value = "\r\n" (you need both expressions to make a new line)
string a = xDoc.InnerXml.Replace("&#xD;", "\r").Replace("&#xA;", "\n").Replace("><",">\r    \n<");
StreamWriter sDoc = new StreamWriter(@"Agenda.xml");
sDoc.Write(a);
sDoc.Flush();
sDoc.Dispose();

Это будет, как вы видите, просто строка