Kiedy tworzę XML od podstaw XmlDocument
, OuterXml
właściwość ma już wszystko ładnie wcięte z podziałami linii. Jednakże, jeśli użyję LoadXml
jakiegoś bardzo „skompresowanego” XML-a (bez podziałów wierszy lub wcięć), wtedy wynik działania OuterXml
pozostaje taki. Więc ...
Jaki jest najprostszy sposób uzyskania upiększonych danych wyjściowych XML z wystąpienia programu XmlDocument
?
c#
.net
xmldocument
outerxml
Neil C. Obremski
źródło
źródło
settings.Encoding = Encoding.UTF8;
MemoryStream
+StreamWriter
z określonym kodowaniem zamiast znakuStringBuilder
i uzyskując tekst za pomocąenc.GetString(memstream.GetBuffer(), 0, (int)memstream.Length);
. Jednak wynik końcowy nadal nie jest w żaden sposób sformatowany. Czy może to być związane z tym, że zaczynam od przeczytanego dokumentu, który ma już formatowanie? Chcę tylko, żeby sformatowano również moje nowe węzły."\r\n"
toEnvironment.Newline
.doc.PreserveWhitespace
nie powinna być ustawiona na true. W przeciwnym razie zakończy się niepowodzeniem, jeśli zawiera już częściowe wcięcie.Zgodnie z adaptacją z bloga Eriki Ehrli powinno to wystarczyć:
źródło
using
instrukcji spowoduje automatyczne zamknięcie pisarza poDispose()
wywołaniu.Lub nawet łatwiej, jeśli masz dostęp do Linq
źródło
<?xml ...?>
i<!DOCTYPE ...>
z pliku XML. OK dla fragmentu, ale niepożądane dla pełnego dokumentu.Krótsza wersja metody rozszerzenia
źródło
Jeśli powyższa metoda Beautify jest wywoływana dla elementu,
XmlDocument
który już zawieraXmlProcessingInstruction
węzeł podrzędny, generowany jest następujący wyjątek:To jest moja zmodyfikowana wersja oryginalnej, aby pozbyć się wyjątku:
U mnie teraz działa, prawdopodobnie musiałbyś przeskanować wszystkie węzły potomne
XmlProcessingInstruction
, a nie tylko pierwszy?Aktualizacja kwiecień 2015:
Ponieważ miałem inny przypadek, w którym kodowanie było nieprawidłowe, szukałem sposobu na wymuszenie UTF-8 bez BOM. Znalazłem ten post na blogu i utworzyłem na jego podstawie funkcję:
źródło
Encoding = Encoding.UTF8
iOmitXmlDeclaration = true
źródło
źródło
Prostym sposobem jest użycie:
Podobnie jak w tym przykładowym kodzie, ten kod jest tym, czego użyłem do utworzenia struktury podobnej do widoku drzewa przy użyciu XMLWriter:
W ten sposób możesz dodawać znaki tabulacji lub podziały wierszy w zwykły sposób, tj. \ T lub \ n
źródło
Wdrażając zamieszczone tutaj sugestie, miałem problem z kodowaniem tekstu. Wygląda na to, że kodowanie
XmlWriterSettings
jest ignorowane i zawsze zastępowane przez kodowanie strumienia. W przypadku używania aStringBuilder
jest to zawsze kodowanie tekstu używane wewnętrznie w C #, a mianowicie UTF-16.Oto wersja, która obsługuje również inne kodowania.
WAŻNA UWAGA: Formatowanie jest całkowicie ignorowane, jeśli
XMLDocument
obiekt mapreserveWhitespace
włączoną właściwość podczas ładowania dokumentu. Przez chwilę byłem zaskoczony, więc nie włączaj tego.Mój ostateczny kod:
Spowoduje to zapisanie sformatowanego pliku XML na dysku z podanym kodowaniem tekstu.
źródło
Jeśli masz ciąg XML, a nie dokument gotowy do użycia, możesz to zrobić w ten sposób:
źródło
Bardziej uproszczone podejście oparte na zaakceptowanej odpowiedzi:
Ustawienie nowej linii nie jest konieczne. Znaki wcięcia mają również domyślne dwie spacje, więc wolałem też ich nie ustawiać.
źródło