¿Cómo guardar nuevas líneas en el atributo XML?


Necesito guardar contenido que contenga nuevas líneas en algunos atributos XML, no texto. El método debe elegirse para que pueda decodificarlo en XSLT 1.0/ESXLT/XSLT 2.0

¿Cuál es el mejor método de codificación?

Por favor sugiera/dé algunas ideas.

Author: David Hall, 2010-01-05

3 answers

En una API DOM compatible no hay nada que tenga que hacer. Simplemente guarde los caracteres reales de nueva línea en el atributo, la API los codificará correctamente por sí misma (consulte Canonical XML spec, sección 5.2).

Si realiza su propia codificación (es decir, reemplaza \n por 
 antes de guardar el valor del atributo), la API codificará su entrada nuevamente, lo que resultará en 
 en el archivo XML.

La conclusión es que el valor de la cadena se guarda textualmente. Sacas lo que pones en, no hay necesidad de interferir.

Sin embargo some algunas implementaciones no son compatibles. Por ejemplo, codificarán caracteres & en valores de atributo, pero olvidarán los caracteres de nueva línea o las pestañas. Esto te pone en una posición de pérdida ya que no puedes simplemente reemplazar las nuevas líneas con 
 de antemano.

Estas implementaciones guardarán caracteres de nueva línea sin codificar, así:

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

Al analizar tal documento, las nuevas líneas literales en los atributos se normalizan en un espacio único (de nuevo, de acuerdo con la especificación) - y por lo tanto se pierden.

Guardar (y retener!) nuevas líneas en atributos es imposible en estas implementaciones.

 66
Author: Tomalak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-11 07:59:31

Puede usar la entidad &#10; para representar una nueva línea en un atributo XML. &#13; se puede usar para representar un retorno de carro. Un CRLF de estilo windows podría representarse como &#13;&#10;.

Esta es la sintaxis XML legal. Vea XML spec para más detalles.

 39
Author: Asaph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-05 06:19:01

Una respuesta cruda puede ser:

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();

Esta voluntad como ves es solo una cadena

 0
Author: rosca dragos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-26 19:28:33