2011-12-22 4 views
6

Sto usando XDocument in LINQ per modificare (inserire) e salvare il documento xml.xdocument save preservare lo spazio bianco all'interno dei tag

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

sample.xml prima doc.Save:

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

sample.xml dopo doc.Save

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

Come si può vedere, c'è il doppio spazio dopo ATTRIB1 e un singolo spazio dopo ATTRIB2 nel documento originale. Ma questi spazi sono stati rimossi da linq quando chiamo doc.save.

Come posso conservare gli spazi bianchi all'interno del tag?

+1

perché lo richiederebbe? – ChrisWue

+7

Questo è il requisito ...... – Rocky

risposta

11

Credo che LoadOptions.PreserveWhitespace e SaveOptions.DisableFormatting istruiscano solo XDocument su come gestire gli spazi bianchi in termini di rientro e il contenuto dei nodi di testo. Otterrebbe comunque la normalizzazione degli attributi, ecc.

È possibile utilizzare un sovraccarico in cui si specifica un XmlWriter configurato per eseguire ciò che si desidera e se non è possibile trovare una configurazione che funzioni con XmlTextWriter predefinito, puoi sempre creare il tuo XmlWriter.

1

Questi sono "spazi non significativi" e vengono rimossi al momento di leggendo il codice XML. Quando chiamate il salvataggio, non vi sono informazioni sulla spaziatura tra gli attributi. (Si noti che in senso stretto anche l'ordine degli attributi potrebbe non essere noto in quanto non ha alcun significato in XML).

Se si desidera leggere/scrivere XML in un modo non direttamente supportato dallo standard XML, è necessario fornire una gestione personalizzata. A seconda dei requisiti, XmlWriter può essere sufficiente (ovvero se si desidera separare uniformemente gli attributi con 2 spazi bianchi) o sarà necessario creare un intero stack (lettori/scrittori/nodi) autonomamente se si desidera conservare effettivamente le informazioni dall'XML originale (trattandolo come testo, non XML).

+0

Questo non sembra corretto. Credo che sia riformattato durante il salvataggio, non la lettura. E anche se fosse vero, allora la documentazione sta letteralmente mentendo; noterete la documentazione per il messaggio "LoadOptions.PreserveWhitespace'" "Preserva uno spazio bianco insignificante durante l'analisi". e la documentazione di 'SaveOptions.DisableFormatting' recita" Conserva tutto lo spazio bianco insignificante durante la serializzazione. ". – BrainSlugs83

+0

Anche il commento su questo XML non supportato dallo standard è fuori luogo, se non fosse supportato dallo standard, non sarebbe un XML valido, e un'eccezione verrebbe generata al momento del parsing. – BrainSlugs83

+0

@ BrainSlugs83 - Si noti che dal punto di vista XML lo spazio bianco significativo/insignificante viene considerato solo all'interno del contenuto dell'elemento (non nel tag di inizio dove sono gli attributi) - quindi 2 spazi tra attributi non sono considerati "spazi" ma piuttosto solo separatori di sintassi per attributi . Quindi non sono sicuro del motivo per cui "PreserveWhitespace" dovrebbe avere un impatto su come vengono gestiti gli spazi tra gli attributi. Controlla http://www.w3.org/TR/2000/REC-xml-20001006#sec-white-space per una definizione più formale. –