问题背景:
我有来自我要验证的网络服务(我无法控制其内容)的XML响应。例如,响应中通常会有一个URL,其中包含使用“&”的查询字符串参数。
代码:
以下代码给出了一个使用非法字符转义XML字符串的示例。这确实会产生一个转义字符串:
string xml = "<node>it's my \"node\" & i like it<node>";
string encodedXml = System.Security.SecurityElement.Escape(xml);
// RESULT: <node>it's my "node" & i like it<node>
如果我知道尝试将此转义的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对象中?
答案 0 :(得分:1)
这不是有效的XML文档:
<node>it's my "node" & i like it<node>
当您转义标记上的尖括号时,XML解析器不再将它们视为标记。它只是一个元素中的文本 - 但是没有包含它的元素。在XML中,必须有一个根元素。这是一项要求。这可能是一个任意的要求,这可能是不公正的,但你永远不会赢得与解析器的争论。
你正在做的就像把它交给C#编译器:
string s = \"foo\" bar\";
外部报价不应该被转义。
这就是您想要的:
string xml = "<node>it's my "node" & 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
课程,尤其是HtmlDecode和UrlDecode。这可能会将您的“字符串”数据转换为正确的Xml。
答案 2 :(得分:0)
如果您从服务中收到有效的XML,则可以使用以下内容转换响应:
//...
WebResponse response = request.GetResponse();
XDocument doc = XDocument.Parse
((
new System.IO.StreamReader
(
response.GetResponseStream()
)
).ReadToEnd());
如果您从应该返回有效XML的服务中收到无效的XML,请联系谁拥有/提供该服务/以适当的方式向他们提供支持服务单。
任何其他行动都是黑客攻击。有时这可能是必需的(例如,当您处理的遗留系统不再受到从未纠正的错误的支持时),但首先追求非hacky路线。