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

C# 如何从完全转义的Xml字符串创建Xml文档?,c#,.net,xml,xmldocument,C#,.net,Xml,Xmldocument,问题背景: string xml = "<node>it&apos;s my &quot;node&quot; &amp; i like it</node>"; 我有一个来自web服务(我无法控制其内容)的XML响应,我想验证它。例如,响应中通常会有一个URL,其中包含使用“&”的查询字符串参数 代码: string xml = "<node>it&apos;s my &quot;node&quot;

问题背景:

string xml = "<node>it&apos;s my &quot;node&quot; &amp; i like it</node>";
我有一个来自web服务(我无法控制其内容)的XML响应,我想验证它。例如,响应中通常会有一个URL,其中包含使用“&”的查询字符串参数

代码:

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>";
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;
错误输出:

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

如何将转义的XML加载到XML文档对象中?

这不是有效的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>";
string xml=“这是我的“节点”&我喜欢它”;
还要注意,您的原始XML已被破坏:

string xml=“这是我的\“节点\”&我喜欢它”;

您的“结束”标记不是结束标记。它应该是
,而不是

如果您收到来自另一个web应用程序/API/服务的响应,则内容可能是Html编码的


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

如果您从服务接收到有效的Xml,则可以使用以下方式转换响应:

//...
WebResponse response = request.GetResponse();
XDocument doc = XDocument.Parse
((
    new System.IO.StreamReader
    (
        response.GetResponseStream()
    )
).ReadToEnd());
如果您从服务接收到无效的XML,而该服务应该返回有效的XML,请与拥有/提供该服务的人联系,并以适当的方式向他们发出支持通知单


任何其他行为都是黑客行为。有时可能需要这样做(例如,当您处理的遗留系统不再支持从未被纠正的错误时),但应首先采用非黑客路线。

提供有效的XML。不要逃避尖括号。它们意义重大。你所做的就像是把它交给C#编译器:
var x=\“some text\”。仅在字符串中转义引号字符。不要对分隔字符串的有意义的引号字符进行转义。我不确定,但用于转义的类是否应该能够将其反转?您的输入XML无效,因为它是裸的&并且格式不正确的结束标记。除非您知道要进行哪些特定的手动更正,否则您不可能使其有效,从而将其视为XML。输入的XML格式不正确。您只能通过对可能出现的问题的具体了解来“修复”它。