2012-07-13 14 views
6

De acuerdo con esta pregunta:LINQ to XML ignora los saltos de línea en los atributos

Are line breaks in XML attribute values allowed?

saltos de línea en los atributos XML son perfectamente válidos (aunque tal vez no se recomienda):

<xmltag1> 
    <xmltag2 attrib="line 1 
line 2 
line 3"> 
    </xmltag2> 
</xmltag1> 

Cuando analizo tal XML usando LINQ to XML (System.Xml.Linq), esos saltos de línea se convierten silenciosamente a los caracteres de espacio ' '.

¿Hay alguna manera de decirle al analizador XDocument.Load() que conserve esos saltos de línea?

P.S .: El XML que estoy analizando está escrito por un software de terceros, por lo que no puedo cambiar la forma en que se escriben los saltos de línea.

+0

Si está escribiendo atributos programáticamente, mire este artículo que muestra diferentes formas de escapar de la cadena.http: //weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape- an-XML-string-in-C.aspx tenga en cuenta que no solo se deben escapar los saltos de línea. –

Respuesta

9

Si desea preservar los saltos de línea en los valores de los atributos, debe escribirlos con referencias de caracteres, p. Ej.

<foo bar="Line 1.&#10;Line 2.&#10;Line3."/> 

que de otra forma el analizador XML se normalizará a los espacios, de acuerdo con la especificación XML http://www.w3.org/TR/xml/#AVNormalize.

[editar] Si se quiere evitar la normalización valor del atributo a continuación, cargar el XML con un legado XmlTextReader ayuda:

  string testXml = @"<foo bar=""Line 1. 
Line 2. 
Line 3.""/>"; 

      XDocument test; 
      using (XmlTextReader xtr = new XmlTextReader(new StringReader(testXml))) 
      { 
       xtr.Normalization = false; 
       test = XDocument.Load(xtr); 
      } 
      Console.WriteLine("|{0}|", test.Root.Attribute("bar").Value); 

que las salidas

|Line 1. 
Line 2. 
Line 3.| 
+0

Gracias, pero como escribí en mi pregunta, el XML está escrito por un software de terceros, así que no puedo cambiar esto. Tal vez necesito algún tipo de reemplazo RegEx que convierta los saltos de línea a – cheeesus

+0

Vi esa nota en su pregunta, pero en este caso hay una especificación clara y el resultado que obtiene es cumplir con la especificación. Así que escribí esa respuesta para señalar que el comportamiento que obtienes es el correcto, incluso si no lo deseas en tu caso. Sin embargo, creo que un legado 'XmlTextReader' te permitirá evitar la normalización del valor del atributo, por lo que editaré mi respuesta para mostrar eso. –

+0

¡gracias! el 'XmlTextReader' hace el trabajo – cheeesus

0

los saltos de línea no son espacios cuando lo analiza (no código ASCII 32) si revisa cada letra verá que el "espacio ''" es un código ASCII 10 = LF (LineFeed) (!!) - por lo que los saltos de línea todavía están presentes si necesita intentar reemplazar ellos con un ASCII 13 en su código ... (cuadros de texto (ventanas) no muestran formas LF como un salto de línea)

+0

Gracias, lo probé antes, y realmente obtuve dos códigos ASCII de 32 caracteres donde deberían estar los saltos de línea. Voy a probar eso nuevamente para estar seguro. – cheeesus

+1

Lo probé de nuevo. Ambos caracteres ''\ r'' y'' \ n'' en el atributo XML se convierten en espacios '''' (código ASCII 32). – cheeesus

+0

u'r right - eso se aplica a una sección de cdata - no pudo encontrar una manera actualmente para preservar los saltos de línea. ¿Es una reaplace de 32 32 a LB una opción para usted? – Cadburry

0

Según MSDN:

Aunque los procesadores XML conservan todo el espacio en blanco en el contenido del elemento, que con frecuencia se normalizan en valores de atributos. Las pestañas, los retornos de carro y los espacios se informan como espacios únicos. En ciertos tipos de atributos, recortan el espacio en blanco que aparece antes o después del cuerpo principal del valor y reducen el espacio en blanco dentro del valor a espacios individuales. (Si un DTD está disponible, este recorte se llevará a cabo en todos los atributos que no son del tipo CDATA.)

Por ejemplo, un documento XML puede contener las siguientes:

informes analizador
<whiteSpaceLoss note1="this is a note." note2="this 
is 
a 
note."> 

un XML tanto valores de atributo como "this is a note.", convirtiendo los saltos de línea en espacios individuales.

No encuentro nada sobre la preservación de los espacios en blanco de los atributos, pero supongo que puede ser imposible según esta explicación.

Cuestiones relacionadas