Ich arbeite mit einer Legacy-Anwendung, die keine abgekürzten leeren XML-Elemente importiert. Zum Beispiel:
BAD leer:
%Vor%GUT leer:
%Vor%Ich kenne die Lösung, um dies zu erreichen, die ich jetzt vorstellen werde:
%Vor%und der Client-Code:
%Vor% Wenn Sie jedoch sorgfältig beobachtet haben, werden die XmlWriterSettings
niemals im Client-Code verwendet. Daher ist die XML-Ausgabe schrecklich formatiert. Meine Fragen sind: Wie kann ich den obigen Code anpassen, um XmlWriterSettings
zu akzeptieren?
Die Verwendung von Factory-Erstellungsmethoden und versiegelten / internen / abstrakten Klassen erschwert die Implementierung einer Außerkraftsetzung.
Ich werde eine alternative Lösung akzeptieren, ich bin nicht mit meiner obigen Lösung verheiratet.
Schritt 1: Erstellen Sie die folgende Klasse in Ihrer Lösung:
%Vor%Schritt 2: Fügen Sie den folgenden Clientcode hinzu. Stellen Sie sicher, dass YOUR_OBJECT_TYPE und YOUR_OBJECT_INSTANCE durch die Klasse und die Instanz ersetzt werden, mit denen Sie arbeiten:
%Vor%Die obige Problemumgehung erzeugt die folgende leere XML-Elementformatierung:
%Vor%Das Problem bei dieser Problemumgehung besteht darin, dass ein Zeilenvorschub hinzugefügt wird (beachten Sie, dass die Elemente sich in separaten Zeilen befinden). Dies mag für Sie akzeptabel sein, verursacht jedoch Probleme mit meiner alten Anwendung.
Wie wäre es damit.
Besorgen Sie sich die tolle XmlWrappingWriter
Klasse von Ссылка (Ich habe den Code aus Gründen weggelassen Kürze).
Damit können wir eine Unterklasse wie folgt erstellen (sehr ähnlich der ursprünglichen):
%Vor%Es kann dann wie folgt aufgerufen werden (wieder sehr ähnlich):
%Vor%In meinem Fall ein Element, das zuvor als
gerendert wurde %Vor%wurde
%Vor% Wie Sie in Ihrer Frage angedeutet haben, ist dies ein ziemlich kniffliges Problem, da alles versiegelt / intern usw. ist, was Überschreibungen ziemlich schwierig macht. Ich denke, mein größtes Problem war, ein XmlWriter
zu bekommen, um XmlWriterSettings
zu akzeptieren: jenseits dieses Ansatzes konnte ich keine Möglichkeit finden, die ursprüngliche XmlTextWriterFull
die angegebene XmlWriterSettings
zu erhalten.
MSDN gibt an, dass diese Methode:
%Vor% Kann verwendet werden, um XmlWriterSettings
auf XmlWriter
anzuwenden. Ich konnte das nicht so ausführen, wie ich es wollte (der Einzug funktionierte nie zum Beispiel), und nach dem Dekompilieren des Codes scheint es nicht so, dass alle Einstellungen mit dieser bestimmten Methode verwendet werden, weshalb mein Aufrufcode gerade reingeht Die outputFile
(ein Stream von einer Art würde genauso gut funktionieren).
Die Problemumgehungslösung, die Sie in Ihrer Frage angegeben haben, fügt zusätzliche Zeilenumbrüche hinzu (wenn Einrückung aktiviert ist), da wir dem Verfasser mitteilen, dieses Element so zu behandeln, als hätte es untergeordnete Elemente.
So habe ich Ihre Problemumgehung geändert, um die Einrückung dynamisch zu manipulieren, um diese zusätzlichen Zeilenumbrüche zu vermeiden.
%Vor%Lassen Sie das hier für den Fall, dass jemand es braucht; denn keine der obigen Antworten löste es für mich oder schien übertrieben zu sein.
%Vor% Der Trick bestand darin, die XmlWriterSettings.Indent = true festzulegen und sie dem XmlWriter . Alternativ können Sie auch anstelle eines XmlWriterSettings. Bearbeiten:
Das folgende Code-Snippet erzwingt das Drucken des schließenden Tags in derselben Zeile (Entschuldigung für die vb-Version, es sollte einfach sein, dasselbe mit C # neu zu schreiben):
%Vor%Tags und Links c# xml serialization