2010-01-05 13 views
48

Necesito guardar contenido que contenga líneas nuevas en algunos atributos XML, no en texto. El método debe seleccionarse para poder descifrarlo en XSLT 1.0/ESXLT/XSLT 2.0Cómo guardar nuevas líneas en el atributo XML?

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

Por favor sugiera/dé algunas ideas.

+0

posible duplicado de [¿Son los saltos de línea en el atributo XML valores válidos?] (Http: // stackoverflow. com/questions/449627/are-line-breaks-in-xml-attribute-values-valid) –

+0

hizo un ejemplo para una pregunta similar: http://stackoverflow.com/a/29782321/611007 – n611x007

+0

relacionado: https://stackoverflow.com/questions/260436/ - relacionado: https://stackoverflow.com/questions/449627/ - relacionado: https://stackoverflow.com/questions/1289524/ – n611x007

Respuesta

64

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

Si usted hace su propia codificación (es decir, la sustitución de \n con 
 antes de guardar el valor del atributo), la API codificar su entrada de nuevo , lo que resulta en 
 en el archivo XML.

La línea inferior es, el valor de la cadena se guarda al pie de la letra. Sacas lo que pones, no hay necesidad de interferir.

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

Estas implementaciones salvarán caracteres de nueva línea sin codificar, como este:

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

Al analizar un documento tal, saltos de línea literales en atributos están normalizados en un solo espacio (de nuevo, de acuerdo con la especificación) - y por lo tanto están perdidos.

Salvar (y retener!) Nuevas líneas en los atributos es imposible en estas implementaciones.

+0

Algo con lo que me encontré: XML usa líneas nuevas estilo Unix (LF). Por lo tanto, si desea almacenar nuevas líneas estilo Windows (CR + LF), deberá convertir las líneas nuevas después de leer su atributo o escapar de las líneas nuevas de alguna manera. Fuente: http://www.w3schools.com/xml/xml_syntax.asp – Joe

+2

@Joe: ¿De dónde saca la información de ese XML que utiliza líneas nuevas estilo Unix? Por lo que puedo ver, [la especificación] (http://www.w3.org/TR/xml/) no restringe eso. – Tomalak

+0

@Tomalak Desplácese hasta la parte inferior de ese enlace. Busque el encabezado "XML Stores New Line como LF". Me di cuenta de esto en la práctica también: tanto el XmlWriter en C# como en un componente de terceros eliminan los caracteres CR (dejando solo LF, como Unix). – Joe

37

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 estilo de Windows CRLF podría representarse como &#13;&#10;.

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

+0

¿Es un carácter XML válido? –

+0

Supongo que tengo que usar alguna codificación en lugar de entidad Como getAttribute no funcionará con una cadena que contenga nueva línea. ¿Tienes muchas ideas? ¿La entidad resolverá el problema getAttribute? – Tommy

+0

@ Chathaturanga Chandrasekara: Sí. Es XML válido. Actualicé mi respuesta para incluir un enlace a la especificación XML donde se mencionan estos símbolos. – Asaph

0

Una respuesta crudo 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 se ve es sólo una cadena

Cuestiones relacionadas