Kai
Kai

Reputation: 2987

Escaping ONLY contents of Node in XML

I have a part of code mentioned like below.

    //Reading from a file and assign to the variable named "s"
    string s = "<item><name> Foo </name></item>";
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(s);

But, it stops working if the contents has characters something like "<", ">"..etc.

string s = "<item><name> Foo > Bar </name></item>";

I know, I have to escape those characters before loading but, if I do like

 doc.LoadXml(System.Security.SecurityElement.Escape(s));

, the tags (< , >) are also escaped and as a result, the error occurs.

How can I solve this problem?

Upvotes: 2

Views: 3669

Answers (4)

Paul Farry
Paul Farry

Reputation: 4768

It looks like the strings that you have generated are strings, and not valid XML. You can either get the strings generated as valid XML OR if you know that the strings are always going to be the name, then don't include the XML <item> and <name> tags in the data.

Then when you create the XMLDocument. do a CreateElement and assign your string before resaving the results.

XmlDocument doc = new XmlDocument(); 
XmlElement root = doc.CreateElement("item");
doc.AppendChild(root);
XmlElement name = doc.CreateElement("name");
name.InnerText = "the contents from your file";
root.AppendChild(name);

Upvotes: 1

ojlovecd
ojlovecd

Reputation: 4902

a tricky solution:

    string s = "<item><name> Foo > Bar </name></item>";
    s = Regex.Replace(s, @"<[^>]+?>", m => HttpUtility.HtmlEncode(m.Value)).Replace("<","ojlovecd").Replace(">","cdloveoj");
    s = HttpUtility.HtmlDecode(s).Replace("ojlovecd", "&gt;").Replace("cdloveoj", "&lt;");
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(s);

Upvotes: 1

KV Prajapati
KV Prajapati

Reputation: 94645

Assign the content of string to the InnerXml property of node.

 var node = doc.CreateElement("root");
 node.InnerXml = s;

Take a look at - Different ways how to escape an XML string in C#

Upvotes: 1

cwharris
cwharris

Reputation: 18125

Assuming your content will never contain the characters "]]>", you can use CDATA.

string s = "<item><name><![CDATA[ Foo > Bar ]]></name></item>";

Otherwise, you'll need to html encode your special characters, and decode them before you use/display them (unless it's in a browser).

string s = "<item><name> Foo &gt; Bar </name></item>";

Upvotes: 1

Related Questions