Codefieber.de

IT-Blog

XML String escape – Möglichkeiten um einen XML-String in C# zu escapen

| Keine Kommentare

XML String escape ist notwendig, wenn XML-Text in einem XML-Dokument gespeichert werden soll. Wenn die Sonderzeichen nicht escaped werden, wird ein Teil des ursprünglichen XML-DOM und nicht ein Wert von einem Knoten angezeigt.

XML-Escaping bedeutet im Grunde, dass die unten genannten 5 Chars mit neuen Werten ersetzt werden.

Die Ersetzungen sehen wie folgt aus:

< -> &lt;
> -> &gt;
" -> "
' -> '
& -> &amp;

Hier zeige ich nun vier Wege um ein XML in C# zu encoden:

1. string.Replace() 5 mal hintereinader

Das ist nicht schön, aber es funktioniert. Zu beachten ist, dass Replace(“&”, “&”) zuerst kommen sollte, da die Funktion auch schon escapete &-Zeichen nochmal escapen kann!

WebUtility.HtmlDecode(string);

string xml = "<node>it's my \"node\" & i like it<node>";
encodedXml = xml.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("\"", "&quot;").Replace("'", "&apos;");

// RESULT: &lt;node&gt;it&apos;s my &quot;node&quot; &amp; i like it&lt;node&gt;


2. System.Web.HttpUtility.HtmlEncode()

Wird benutzt um HTML-Code zu encodieren. Da aber XML eine Form von HTML ist, können wir den Code-Snippet ebenfalls benutzen. System.Web.HttpUtility.HtmlEncode() wird am meisten in ASP.NET Anwendungen genutzt. Allerdings ist hierbei zu beachten, dass ein Abostoph (‘) nicht encodiert wird!

string xml = "<node>it's my \"node\" & i like it<node>";
string encodedXml = HttpUtility.HtmlEncode(xml);

// RESULT: &lt;node&gt;it's my &quot;node&quot; &amp; i like it&lt;node&gt;

3. System.Security.SecurityElement.Escape()

In Windows Forms- oder aber auch in Consolen-Anwendungen kann man diese Methode anwenden. Man benötigt nicht die riesen System.Web Referenz im Projekt und die Funktion encodiert alle 5 Chars.

string xml = "<node>it's my \"node\" & i like it<node>";
string encodedXml = System.Security.SecurityElement.Escape(xml);

// RESULT: &lt;node&gt;it&apos;s my &quot;node&quot; &amp; i like it&lt;node&gt;

4. System.Xml.XmlTextWriter

Mit XmlTextWriter Sie nicht haben, um über Flucht nichts zu kümmern, da es entgeht den Zeichen, wo nötig. Zum Beispiel in den Attributen sie nicht entkommen Apostrophe, während im Knotenwerte sie nicht entkommen Apostrophe und qoutes.

Wenn man den XmlTextWriter nutzt, brauch man sich um das encodieren gar nicht kümmern, es werden die Chars encodiert, die nötig sind. Allerdings wieder kein Apostroph (‘)!

string xml = "<node>it's my \"node\" & i like it<node>";
using (XmlTextWriter xtw = new XmlTextWriter(@"c:\xmlTest.xml", Encoding.Unicode))
{
    xtw.WriteStartElement("xmlEncodeTest");
    xtw.WriteAttributeString("testAttribute", xml);
    xtw.WriteString(xml);
    xtw.WriteEndElement();
}

// RESULT:
/*
<xmlEncodeTest testAttribute="&lt;node&gt;it's my &quot;node&quot; &amp; i like it&lt;node&gt;">
    &lt;node&gt;it's my "node" &amp; i like it&lt;node&gt;
</xmlEncodeTest>
*/

Wie man ja weiß: Viele Wege führen nach Rom. Jede Funktion hat ihre Berechtigung und wie man sieht funktionieren sie auch in etwa ähnlich, aber doch anders. Für jeden Bereich entsprechend.
Mein Tipp: Man macht nichts mit der 3. Methode System.Security.SecurityElement.Escape() verkehrt.

avatar

Autor: Pascal

Codefieber.de wird von Pascal Betke geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.