如何从完全转义的Xml字符串创建Xml文档?

时间:2017-07-11 14:48:42

标签: c# .net xml xmldocument

问题背景:

我有来自我要验证的网络服务(我无法控制其内容)的XML响应。例如,响应中通常会有一个URL,其中包含使用“&”的查询字符串参数。

代码:

以下代码给出了一个使用非法字符转义XML字符串的示例。这确实会产生一个转义字符串:

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;

如果我知道尝试将此转义的XML加载到新的Xml文档中,我将收到一条错误,指出XML的第一个字符无效:

var doc = new XmlDocument();

// Error will occur here.
doc.LoadXml(encodedXml);

错误输出:

Data at the root level is invalid. Line 1, position 1.

如何将此转义的XML加载到XML Document对象中?

3 个答案:

答案 0 :(得分:1)

这不是有效的XML文档:

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

当您转义标记上的尖括号时,XML解析器不再将它们视为标记。它只是一个元素中的文本 - 但是没有包含它的元素。在XML中,必须有一个根元素。这是一项要求。这可能是一个任意的要求,这可能是不公正的,但你永远不会赢得与解析器的争论。

你正在做的就像把它交给C#编译器:

string s = \"foo\" bar\";

外部报价不应该被转义。

这就是您想要的:

string xml = "<node>it&apos;s my &quot;node&quot; &amp; i like it</node>";

另请注意,您的原始XML 已经损坏

string xml = "<node>it's my \"node\" & i like it<node>";

你&#34;关闭&#34;标签不是结束标签。它应该是</node>,而不是<node>

答案 1 :(得分:0)

如果您收到其他网络应用程序/ API /服务的回复,则内容可能是Html编码的。

查看WebUtility课程,尤其是HtmlDecodeUrlDecode。这可能会将您的“字符串”数据转换为正确的Xml。

答案 2 :(得分:0)

如果您从服务中收到有效的XML,则可以使用以下内容转换响应:

//...
WebResponse response = request.GetResponse();
XDocument doc = XDocument.Parse
((
    new System.IO.StreamReader
    (
        response.GetResponseStream()
    )
).ReadToEnd());

如果您从应该返回有效XML的服务中收到无效的XML,请联系谁拥有/提供该服务/以适当的方式向他们提供支持服务单。

任何其他行动都是黑客攻击。有时这可能是必需的(例如,当您处理的遗留系统不再受到从未纠正的错误的支持时),但首先追求非hacky路线。