2011-12-14 14 views
5

Sto provando a leggere in un file di configurazione XML, a fare qualche ritocco (trovare, rimuovere o aggiungere un elemento) e salvarlo di nuovo. Voglio che questa modifica sia come non-intrusivo possibile, in quanto il file sarà sotto il controllo di origine e non voglio che le modifiche insignificanti per causare fondersi conflitti, ecc Questo è più o meno quello che ho:Come conservare tutta la formattazione XML con XDocument?

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

ci sono alcuni problemi che compaiono qui:

  1. encoding="utf-8" viene aggiunto alla dichiarazione xml.
  2. <tag attr="val"/> diventa <tag attr="val" />
  3. Gli attributi che sono stati distribuiti su righe separate per la leggibilità vengono trasferiti tutti su una riga.

C'è un modo per essere meno invadente con XDocument o dovrò solo provare e fare il montaggio delle stringhe per ottenere quello che voglio?

risposta

4

Il modello di oggetto LINQ su XML non memorizza se un elemento analizzato è contrassegnato come <foo/> o <foo />, quindi quando si ripristina tale informazione si perde. Se si desidera garantire un determinato formato, è possibile estendere un'implementazione XmlWriter e sovrascriverne il valore http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writeendelement.aspx ma in questo modo non si manterrà il formato di input, piuttosto si scriverà qualsiasi elemento vuoto come <foo/> o qualsiasi formato implementato nel metodo .

Ci sono altri cambiamenti che possono accadere, ad esempio, quando si carica il file

<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> 

e salvandolo di nuovo il risultato viene

<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> 

quindi non aspettatevi i dettagli di markup da conservare quando caricamento/salvataggio con XDocument/XElement.

+1

Quindi credo che la risposta breve è "non si può". :( – RandomEngy

1

Per evitare la dichiarazione nell'intestazione del documento è possibile utilizzare il seguente

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


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