Wenn ich XML von Grund auf neu aufbaue XmlDocument
, hat die OuterXml
Eigenschaft bereits alles schön eingerückt mit Zeilenumbrüchen. Wenn ich jedoch LoadXml
sehr "komprimiertes" XML aufrufe (keine Zeilenumbrüche oder Einrückungen), OuterXml
bleibt die Ausgabe von so. So ...
Was ist der einfachste Weg, um eine verschönerte XML-Ausgabe von einer Instanz von zu erhalten XmlDocument
?
c#
.net
xmldocument
outerxml
Neil C. Obremski
quelle
quelle
settings.Encoding = Encoding.UTF8;
MemoryStream
+StreamWriter
mit einer angegebenen Codierung anstelle von verwendetStringBuilder
wird und der Text mit abgerufen wirdenc.GetString(memstream.GetBuffer(), 0, (int)memstream.Length);
. Das Endergebnis ist jedoch noch in keiner Weise formatiert. Könnte es sein, dass ich von einem gelesenen Dokument ausgehe, das bereits formatiert ist? Ich möchte nur, dass meine neuen Knoten auch formatiert werden."\r\n"
zuEnvironment.Newline
.doc.PreserveWhitespace
sollte nicht auf true gesetzt werden. Andernfalls schlägt es fehl, wenn es bereits teilweise Einrückungen enthält.Wie aus Erika Ehrlis Blog hervorgeht, sollte dies Folgendes tun:
quelle
using
Anweisung wird der Writer automatisch geschlossen, wenn erDispose()
aufgerufen wird.Oder noch einfacher, wenn Sie Zugriff auf Linq haben
quelle
<?xml ...?>
und das<!DOCTYPE ...>
aus dem XML entfernt. OK für ein Fragment, aber nicht wünschenswert für ein vollständiges Dokument.Eine kürzere Version der Erweiterungsmethode
quelle
Wenn die obige Beautify-Methode für einen Knoten aufgerufen wird
XmlDocument
, der bereits einen untergeordnetenXmlProcessingInstruction
Knoten enthält , wird die folgende Ausnahme ausgelöst:Dies ist meine modifizierte Version des Originals, um die Ausnahme zu beseitigen:
Es funktioniert jetzt für mich, wahrscheinlich müssten Sie alle untergeordneten Knoten nach dem
XmlProcessingInstruction
Knoten durchsuchen, nicht nur den ersten?Update April 2015:
Da ich einen anderen Fall hatte, in dem die Codierung falsch war, suchte ich nach Möglichkeiten, UTF-8 ohne Stückliste zu erzwingen. Ich habe diesen Blog-Beitrag gefunden und eine darauf basierende Funktion erstellt:
quelle
Encoding = Encoding.UTF8
undOmitXmlDeclaration = true
quelle
quelle
Ein einfacher Weg ist zu verwenden:
Wie dieser Beispielcode habe ich diesen Code verwendet, um mit XMLWriter eine Struktur wie eine Baumansicht zu erstellen:
Auf diese Weise können Sie Tabulatoren oder Zeilenumbrüche hinzufügen, wie Sie es normalerweise gewohnt sind, dh \ t oder \ n
quelle
Bei der Umsetzung der hier veröffentlichten Vorschläge hatte ich Probleme mit der Textcodierung. Es scheint, dass die Codierung von
XmlWriterSettings
ignoriert und immer durch die Codierung des Streams überschrieben wird. Bei Verwendung einesStringBuilder
ist dies immer die intern in C # verwendete Textcodierung, nämlich UTF-16.Hier ist also eine Version, die auch andere Codierungen unterstützt.
WICHTIGER HINWEIS: Die Formatierung wird vollständig ignoriert, wenn die Eigenschaft Ihres
XMLDocument
ObjektspreserveWhitespace
beim Laden des Dokuments aktiviert ist. Das hat mich eine Weile verblüfft, also stellen Sie sicher, dass Sie das nicht aktivieren.Mein letzter Code:
Dadurch wird die formatierte XML mit der angegebenen Textcodierung auf der Festplatte gespeichert.
quelle
Wenn Sie eine XML-Zeichenfolge anstelle eines gebrauchsfertigen Dokuments haben, können Sie dies folgendermaßen tun:
quelle
Ein vereinfachter Ansatz basierend auf der akzeptierten Antwort:
Das Einstellen der neuen Zeile ist nicht erforderlich. Einrückungszeichen haben auch die Standard-Leerzeichen, daher habe ich es vorgezogen, sie nicht ebenfalls festzulegen.
quelle