2011-12-14 4 views
5

Estoy tratando de leer en un archivo de configuración XML, hacer algunos ajustes (buscar y eliminar o agregar un elemento) y guardarlo de nuevo. Quiero que esta edición sea lo menos intrusivo posible, ya que el archivo estará bajo control de código fuente y no quiero cambios intrascendentes para causar conflictos de fusión, etc. Esto es más o menos lo que tengo:¿Cómo guardo todo el formato XML con XDocument?

XDocument configDoc = XDocument.Load(fileName, LoadOptions.PreserveWhitespace); 
// modifications to configDoc here 
configDoc.Save(fileName, SaveOptions.DisableFormatting); 

Hay algunos problemas que aparecen aquí:

  1. encoding="utf-8" se agrega a la declaración XML.
  2. <tag attr="val"/> se cambia a <tag attr="val" />
  3. atributos que se propagan a través de líneas separadas para facilitar la lectura quedarse relegados a todos en una sola línea.

¿Hay alguna forma de ser menos intrusivo con XDocument o tendré que intentar y hacer la edición de cadenas para obtener lo que quiero?

Respuesta

4

El modelo de objetos LINQ a XML no almacena si un elemento analizado está marcado como <foo/> o <foo />, por lo que al guardar de nuevo esa información se pierde. Si desea garantizar un formato determinado, puede extender una implementación de XmlWriter y anular su http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writeendelement.aspx, pero de esa forma tampoco preservará el formato de entrada, en su lugar, deberá escribir cualquier elemento vacío como <foo/> o cualquier formato que implemente en su método .

Hay otros cambios que pueden ocurrir, por ejemplo, al cargar el archivo

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Example</title> 
    </head> 
    <body> 
    <h1>Example</h1> 
    </body> 
</html> 

y guardar de nuevo el resultado se

<xhtml:html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <xhtml:head> 
    <xhtml:title>Example</xhtml:title> 
    </xhtml:head> 
    <xhtml:body> 
    <xhtml:h1>Example</xhtml:h1> 
    </xhtml:body> 
</xhtml:html> 

así que no esperes detalles de marcado que se conserva cuando cargando/guardando con XDocument/XElement.

+1

Así que supongo que la respuesta corta es "no se puede". :( – RandomEngy

1

Para evitar la declaración en la cabecera del documento puede utilizar el siguiente

XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.OmitXmlDeclaration = true; 


     using (XmlWriter xw = XmlWriter.Create(fileName, settings)) 
     { 
      doc.Save(xw); 
     } 
Cuestiones relacionadas