【问题标题】:C# XDoc Parse XML stringC# XDoc 解析 XML 字符串
【发布时间】:2013-04-22 14:00:07
【问题描述】:

我通过 XML API 接收数据,它返回如下节点:

<?xml version='1.0' encoding='utf-8' ?>

<location>
  <name>&Oslash;L Shop</name>
</location>

我无法控制响应,但我正在尝试将其加载到 XDocument 中,但由于无效字符而失败。

我能做些什么来正确加载这个负载吗?我希望解决方案尽可能通用,因为可能存在其他无效字符。

想法?

【问题讨论】:

  • 老实说,您应该查询xml文件的生产者以生成有效的xml文件。您可能会成功修补输入,但这是一个不可行的解决方案。
  • 我同意。使用的编码仅在 HTML 中有效,在 XML 文件中无效。此字符应编码为,例如,&amp;#216;
  • @SteveB 我同意这里的 real 解决方案是修复响应。但是,我不会说这不是一个可行的解决方案。在处理之前从响应中取消任何无效字符非常容易。将来,如果第 3 方确实解决了问题,它只是成为一个健全性检查。从技术上讲,这也是未来的证明,因为他们还可以重新引入该检查会发现的问题。
  • 令人惊讶的是,经过这么多年,人们仍然认为当他们真正创建看起来像 XML 的文本输出时,他们可以生成有效的 XML。 .
  • 如果唯一的无效文本是应该使用 XML 编码的 HTML 编码,也许您可​​以搜索这些并用有效的等价物替换它们?

标签: c# xml parsing


【解决方案1】:

您可以使用更能容忍无效输入的 html 解析器。例如; (使用HtmlAgilityPack)这段代码没有任何问题。

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(xml);
var name = doc.DocumentNode.Descendants("name").First().InnerText;

【讨论】:

    【解决方案2】:

    您不能在 XDocument.Parse 输入文本中使用“&”符号。将其替换为“&amp;” ,像这样

    <?xml version='1.0' encoding='utf-8' ?>
    
    <location>
      <name>&amp;Oslash;L Shop</name>
    </location>
    

    【讨论】:

    • 这可能不是正确的结果。我希望它应该是 &lt;name&gt;&amp;#216;L Shop&lt;/name&gt;(216 是 Ø 的十进制 Unicode 值,HTML 编码是 &amp;Oslash;
    • &amp;amp; 在 XML 规范中仍然是一个未知实体
    【解决方案3】:

    为什么不在将响应加载到XDocument 之前转义任何无效的XML 字符?您可以为此使用正则表达式,应该相对简单。

    escape invalid XML characters in C#

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多