2011-12-22 13 views
6

Estoy usando XDocument en LINQ para editar (insertar) y guardar el documento xml.xdocument save preserve white space inside tags

XDocument doc = XDocument.Load("c:\\sample.xml", LoadOptions.PreserveWhitespace); 
doc.Save("c:\\sample.xml",SaveOptions.DisableFormatting) 

sample.xml antes doc.Save:

<ELEMENT ATTRIB1="attrib1" ATTRIB2="attrib2" > 
    value 
</ELEMENT> 

sample.xml después doc.Save

<ELEMENT ATTRIB1="attrib1" ATTRIB2="attrib2"> 
    value 
</ELEMENT> 

Como se puede ver, hay una doble espacio después ATTRIB1 y una sola espacio después de ATTRIB2 en el documento original. Pero estos espacios han sido eliminados por linq cuando llamo a doc.save.

¿Cómo puedo conservar la etiqueta dentro de los espacios en blanco?

+1

¿por qué lo necesitarías? – ChrisWue

+7

Ese es el requisito ...... – Rocky

Respuesta

11

Creo que LoadOptions.PreserveWhitespace y SaveOptions.DisableFormatting solo instruyen a XDocument sobre cómo manejar los espacios en blanco en términos de sangría y el contenido de los nodos de texto. Todavía normalizaría los atributos, etc.

Es posible que desee utilizar una sobrecarga donde especifique un XmlWriter que está configurado para hacer lo que desea, y si no puede encontrar una configuración que funcione con el XmlTextWriter predeterminado, siempre puedes crear tu propio XmlWriter.

1

Estos son "espacios en blanco no significativos" y se eliminan en el momento de leyendo el XML. En el momento en que llamas guardar, no hay información sobre el espaciado entre los atributos. (Tenga en cuenta que estrictamente hablando, incluso el orden de los atributos puede no ser conocido ya que no tiene significado en XML).

Si desea leer/escribir XML de una manera que no sea compatible directamente con el estándar XML, debe proporcionar un manejo personalizado. Dependiendo de los requisitos, XmlWriter personalizado puede ser suficiente (es decir, si desea atributos uniformemente separados con 2 espacios en blanco) o tendrá que compilar toda la pila (lectores/escritores/nodos) usted mismo si realmente desea conservar información del XML original (tratándolo) como texto, no XML).

+0

Eso no parece correcto. Creo que se formateó durante el guardado, no la lectura. E incluso si eso fuera cierto, entonces la documentación literalmente miente; Notará que la documentación de 'LoadOptions.PreserveWhitespace' dice" Conserva un espacio en blanco insignificante durante el análisis ". y la documentación para 'SaveOptions.DisableFormatting' dice" Conservar todos los espacios en blanco insignificantes mientras se serializa. ". – BrainSlugs83

+0

También el comentario acerca de que este XML no es compatible con el estándar está fuera de lugar, si no fuera compatible con el estándar, no sería XML válido, y se lanzaría una excepción en el momento del análisis. – BrainSlugs83

+0

@ BrainSlugs83 - Tenga en cuenta que desde el punto de vista XML los espacios en blanco significativos/insignificantes solo se consideran dentro del contenido del elemento (no en la etiqueta de inicio donde están los atributos), así que 2 espacios entre atributos no se consideran "espacios en blanco". . Así que no estoy seguro de por qué crees que 'PreserveWhitespace' debería tener un impacto en cómo se manejan los espacios entre los atributos. Consulte http://www.w3.org/TR/2000/REC-xml-20001006#sec-white-space para obtener una definición más formal. –