【问题标题】:How to create a Xml Document from a fully escaped Xml string?如何从完全转义的 Xml 字符串创建 Xml 文档?
【发布时间】:2017-07-11 14:48:41
【问题描述】:

问题背景:

我有一个来自 Web 服务(我无法控制其内容)的 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 文档对象中?

【问题讨论】:

  • 给它有效的 XML。不要逃避尖括号。它们很重要。您所做的就像将其提供给 C# 编译器:var x = \"some text\";。仅在字符串转义引号字符。不要转义分隔字符串的有意义的引号字符。
  • 我不确定,但是用于转义的类不应该能够反转它吗?
  • 您的输入 XML 无效,因为裸 & 和格式错误的结束标记。除非您知道要进行哪些具体的手动更正,否则您不太可能使其有效并因此将其视为 XML。
  • 这里没有什么神奇的。输入不是格式良好的 XML。您只能通过对可能存在的问题的具体了解来“修复”它。

标签: c# .net xml xmldocument


【解决方案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>";

您的“结束”标签不是结束标签。它应该是&lt;/node&gt;,而不是&lt;node&gt;

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 1970-01-01
        • 2021-01-05
        相关资源
        最近更新 更多