2015-03-10 23 views
5

.NET XmlDocument ma interesujące zachowanie, gdy ładnie drukuje mieszane węzły treści używające XmlDocument.Save(TextWriter).Jakie są powody, dla których zawartość drukowania XmlDocument jest dość drukowana?

Zachowanie można podsumować jako "gdy ładna drukarka napotka węzeł tekstowy, wyłącza wcięcia i automatyczne znaki nowej linii dla reszty bieżącego poddrzewa".

Oto przykład (http://ideone.com/b1WxD7):

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

jest dość drukowany

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

To zachowanie nie wydaje się poprawne, ani intuicyjne. Dlaczego XmlDocument działa tak?

+0

Powinieneś wymienić metodę, której używasz do ładnego drukowania. –

+0

Post ma link do kodu; Wyjaśnię nieco. – zeuxcg

+0

* link do kodu * nie zadziała. Jeśli kod jest częścią pytania, musi być tutaj, w samym pytaniu, a nie w lokalizacji poza nim. –

Odpowiedz

3

Takie zachowanie jest niefortunne, ale myślę, że może to być wyjaśnione w opisie opcji Formatting.Indented dla XmlTextWriter (czego XmlDocument.Save używa tutaj):

Przyczyny elementów podrzędnych być wcięty według do ustawień Indentation i IndentChar. Ta opcja wcina tylko zawartość elementu; nie ma wpływu na zawartość mieszaną.

Intencją tej opcji jest, aby zachować formatowanie XML jak

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

i nie ma to sformatowany jako

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

Ale jest pewien problem: Jak XmlTextWriter wiedzieć element zawiera mieszaną zawartość? Ponieważ XmlTextWriter jest pisarzem non-cached, forward-only, odpowiedź brzmi, że nie ma wartości, dopóki nie napotka danych znakowych. W tym momencie przełącza się w tryb "mieszanej zawartości" i blokuje formatowanie. Niestety, jest zbyt późno, aby cofnąć formatowanie węzłów potomnych, które zostały już zapisane w strumieniu bazowym.

+0

Ah, racja - przegapiłem część "tylko do przodu" i zastanawiałem się, dlaczego nie można przeskanować dzieci, aby sprawdzić, czy zawartość jest mieszana, czy nie. Dzięki! – zeuxcg