2015-03-10 11 views
5

.NET XmlDocument hat ein interessantes Verhalten beim Drucken von Mixed Content-Knoten mit XmlDocument.Save(TextWriter).Was ist das Grundprinzip hinter dem gemischten Druckverhalten von XmlDocument?

Das Verhalten kann wie folgt zusammengefasst werden: "Sobald der hübsche Drucker auf einen Textknoten trifft, werden Einrückung und automatische Zeilenumbrüche für den Rest des aktuellen Teilbaums deaktiviert".

Hier ist ein Beispiel (http://ideone.com/b1WxD7):

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

hübsch

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

Dieses Verhalten scheint nicht richtig noch intuitiv. Warum funktioniert XmlDocument so?

+0

Sie sollten die Methode erwähnen, die Sie verwenden, um schön zu drucken. –

+0

Der Post hat einen Link zum Code; Ich werde etwas klarstellen. – zeuxcg

+0

* ein Link zum Code * wird nicht funktionieren. Wenn der Code Teil der Frage ist, muss er hier, in der Frage selbst und nicht an einem anderen Ort sein. –

Antwort

3

Dieses Verhalten ist bedauerlich, aber ich denke, es kann für XmlTextWriter durch die Beschreibung der Formatting.Indented Option erklärt werden (das ist, was XmlDocument.Save hier verwendet):

Ursachen Kind-Elemente nach eingerückt zu den Indentation und IndentChar Einstellungen. Diese Option beschränkt nur den Inhalt des Elements; gemischter Inhalt ist nicht betroffen.

Die Absicht dieser Option ist die Formatierung von XML wie

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

und nicht haben es als

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

Aber es gibt ein Problem umformatiert zu erhalten: Wie kennt XmlTextWriter ein Element enthält gemischten Inhalt? Da XmlTextWriter ein non-cached, forward-only Writer ist, ist die Antwort, dass es nicht tut, bis es tatsächlich auf Zeichendaten trifft. An diesem Punkt wechselt es in den "Mixed Content" -Modus und unterdrückt die Formatierung. Leider ist es zu spät, um die Formatierung von untergeordneten Knoten rückgängig zu machen, die bereits in den zugrunde liegenden Stream geschrieben wurden.

+0

Ah, richtig - ich vermisste den "nur vorwärts" -Teil und fragte mich, warum es die Kinder nicht scannen kann, um zu überprüfen, ob der Inhalt gemischt ist oder nicht. Vielen Dank! – zeuxcg