2015-03-10 16 views
5

.NET XmlDocument ha un comportamento interessante quando si esegue la stampa di nodi di contenuto misto utilizzando XmlDocument.Save(TextWriter).Qual è la logica alla base del comportamento di tipo "pretty-printing" dei contenuti misti di XmlDocument?

Il comportamento può essere riepilogato come "una volta che la stampante carina incontra un nodo di testo, disabilita il rientro e le nuove righe automatiche per il resto della sottostruttura corrente".

Ecco un esempio (http://ideone.com/b1WxD7):

<?xml version='1.0'?> 
<root><test><child1/><child2/>foo<child3><child4/></child3></test></root> 

è abbastanza stampato a

<?xml version="1.0"?> 
<root> 
    <test> 
    <child1 /> 
    <child2 />foo<child3><child4 /></child3></test> 
</root> 

Questo comportamento non sembra corretto né intuitivo. Perché XmlDocument funziona così?

+0

Si dovrebbe menzionare il metodo che si utilizza per stampare piuttosto. –

+0

Il post ha un collegamento al codice; Chiarirò leggermente. – zeuxcg

+0

* un collegamento al codice * non funzionerà. Se il codice fa parte della domanda, deve essere qui, nella domanda stessa, e non in una posizione esterna al sito. –

risposta

3

Questo comportamento è un peccato, ma penso che può essere spiegato con la descrizione dell'opzione Formatting.Indented per XmlTextWriter (che è ciò che XmlDocument.Save sta usando qui):

elementi cause figlio rientrato secondo alle impostazioni Indentation e IndentChar. Questa opzione consente di indentare solo il contenuto dell'elemento; il contenuto misto non è interessato.

L'intento di questa opzione è quella di conservare la formattazione di XML come

<p>Here is some <b>bold</b> text.</p> 

e non averlo riformattato come

<p> 
    Here is some 
    <b> 
     bold 
    </b> 
    text. 
</p> 

Ma c'è un problema: Come funziona XmlTextWriter conoscere un l'elemento contiene contenuti misti? Poiché XmlTextWriter è uno scrittore non-cached, forward-only, la risposta è che è non finché non incontra effettivamente i dati dei caratteri. A quel punto, passa alla modalità "mixed content" e sopprime la formattazione. Sfortunatamente, è troppo tardi per annullare la formattazione dei nodi figli che sono già stati scritti nello stream sottostante.

+0

Ah, giusto - Ho perso la parte "solo inoltro" e mi chiedevo perché non è possibile eseguire la scansione dei bambini per verificare se il contenuto è misto o meno. Grazie! – zeuxcg