Gibt es eine C # -Funktion, mit der eine Zeichenfolge maskiert und nicht maskiert werden kann, um den Inhalt eines XML-Elements auszufüllen?
Ich verwende VSTS 2008 + C # + .Net 3.0.
EDIT 1: Ich bin einfach und kurz XML - Datei verketten und ich verwende die Serialisierung nicht, so dass ich explizit muß XML - Zeichen mit der Hand entkommen, zum Beispiel, ich brauche zu setzen a<b
in <foo></foo>
, so dass ich String entkommen muss a<b
und es in dem Elemente foo setzen.
new XText(unescaped).ToString()
Antworten:
quelle
HttpUtility.HtmlEncode
vonSystem.Web
sicher verwendet werden könnte?SecurityElement.Escape (Zeichenfolge s)
quelle
BEARBEITEN: Sie sagen "Ich verkette einfache und kurze XML-Dateien und verwende keine Serialisierung, daher muss ich XML-Zeichen explizit von Hand maskieren".
Ich würde Ihnen dringend raten, dies nicht von Hand zu tun. Verwenden Sie die XML-APIs, um alles für Sie zu erledigen - lesen Sie die Originaldateien ein und führen Sie die beiden Dateien zu einem einzigen Dokument zusammen, wie Sie möchten (wahrscheinlich möchten Sie es verwenden)
XmlDocument.ImportNode
), und schreiben Sie es dann erneut aus. Sie möchten keine eigenen XML-Parser / Formatierer schreiben. Serialisierung ist hier etwas irrelevant.Wenn Sie uns ein kurzes, aber vollständiges Beispiel dafür geben können, was Sie genau tun möchten, können wir Ihnen wahrscheinlich dabei helfen, sich keine Sorgen über die Flucht machen zu müssen.
Ursprüngliche Antwort
Es ist nicht ganz klar, was Sie meinen, aber normalerweise erledigen XML-APIs dies für Sie. Sie legen den Text in einem Knoten fest und er entgeht automatisch allem, was er benötigt. Beispielsweise:
Beispiel für LINQ to XML:
DOM-Beispiel:
Ausgabe aus beiden Beispielen:
Dies setzt natürlich voraus, dass XML entkommen soll. Wenn nicht, posten Sie bitte weitere Details.
quelle
Vielen Dank an @sehe für die einzeilige Flucht:
Ich füge noch die einzeilige Flucht hinzu:
quelle
George, es ist einfach. Verwenden Sie immer die XML-APIs, um mit XML umzugehen. Sie erledigen alles für Sie, um zu entkommen und zu entkommen.
Erstellen Sie niemals XML, indem Sie Zeichenfolgen anhängen.
quelle
XmlElementSyntax
. Und es wird auch durch die Tatsache kompliziert, dass Sie das auch generieren müssen///
. Und ich kann nicht jede Zeile als separate Zeile generierenXObject
, da dies bei mehrzeiligen Tags nicht funktioniert.///
davor und formatieren Sie den Code neu. Keine große Sache und sicherlich ein Eckfall. Wenn es absolut notwendig ist, können Sie sicher eine benutzerdefinierte Funktion erstellenXmlWriter
, um Zeilenumbrüche und Leerzeichen nach Ihren Wünschen auszuführen, aber///
vor neuen Zeilen zu platzieren. Verwenden Sie alternativ ein XSLT, um das XML hübsch auszudrucken. In jedem Fall sollte XML dennoch von einer XML-API generiert werden.Und wenn Sie, wie ich, als ich diese Frage gefunden habe, XML-Knotennamen umgehen möchten, wie zum Beispiel beim Lesen aus einer XML-Serialisierung, verwenden Sie den einfachsten Weg:
Leerzeichen und ungültige Zeichen für XML-Elemente werden ebenfalls ausgeblendet.
http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx
quelle
WARNUNG: Nekromantie
Die Antwort von Darin Dimitrov + System.Security.SecurityElement.Escape (Zeichenfolge) ist immer noch nicht vollständig.
In XML 1.1 besteht der einfachste und sicherste Weg darin, ALLES zu codieren.
Wie
	
für \ t.Es wird in XML 1.0 überhaupt nicht unterstützt.
Für XML 1.0 besteht eine mögliche Problemumgehung darin, den Text, der die Zeichen enthält, mit Base-64 zu codieren.
XML 1.0:
quelle
Eine weitere Einstellung, die auf John Skeets Antwort basiert und die Tags nicht zurückgibt :
Dies gibt nur den übergebenen Wert im XML-codierten Format zurück:
quelle
Die folgenden Funktionen erledigen die Arbeit. Ich habe nicht gegen XmlDocument getestet, aber ich denke, das ist viel schneller.
quelle
Verwenden einer Bibliothek eines Drittanbieters ( Newtonsoft.Json ) als Alternative:
Beispiel:
a<b
<==>"a<b"
<foo></foo>
<==>"foo></foo>"
quelle