繁体   English   中英

仅以XML转义Node的内容

[英]Escaping ONLY contents of Node in XML

我有一部分代码如下所述。

    //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);

但是,如果内容中包含“ <”,“>” .. etc等字符,它将停止工作。

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

我知道,在加载之前我必须先转义这些字符,但是,如果我喜欢

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

,标记(<,>)也被转义,结果发生错误。

我怎么解决这个问题?

假设您的内容永远不会包含字符“]]>”,则可以使用CDATA。

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

否则,您将需要对特殊字符进行html编码,并在使用/显示特殊字符之前对其进行解码(除非它在浏览器中)。

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

将字符串的内容分配给节点的InnerXml属性。

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

看一下- 如何在C#中转义XML字符串的不同方法

一个棘手的解决方案:

    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);

看起来您生成的字符串是字符串,而不是有效的XML。 您既可以获取作为有效XML生成的字符串,也可以获取已知的字符串,而不必在数据中包含XML <item><name>标记。

然后,当您创建XMLDocument 在保存结果之前执行CreateElement并分配您的字符串。

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM