【问题标题】:How to prevent XElement from decoding character entity references如何防止 XElement 解码字符实体引用
【发布时间】:2011-10-29 18:10:05
【问题描述】:

我有一个包含撇号的 XML 字符串。我将撇号替换为其等效项并将修改后的字符串解析为 XElement。然而,XElement 将 ' 变回撇号。

如何强制 XElement.Parse 保留编码字符串?

string originalXML = @"<Description><data>Mark's Data</data></Description>"; //for illustration purposes only
string encodedApostrophe = originalXML.Replace("'", "&#39;");
XElement xe = XElement.Parse(encodedApostrophe);

【问题讨论】:

  • 为什么需要它?它们在 XML 中是等价的。
  • 到目前为止,我遇到过一种情况,即客户端在编写 XML 时明确要求上述“编码”......但在阅读时从来没有......如果你想在 . NET 两者之间没有区别(因此无需保留),如果您需要在 .NET 之外处理它并且这是绝对必要的,那么这将需要按照您第一次编写它的方式编写它......
  • RE:我为什么需要这样做?在下游,xml 被嵌入到一些动态生成的 JavaScript 中。嵌入的撇号会破坏 JavaScript 字符串。
  • 那你不能修复 JavaScript 吗?这看起来是一个合适的解决方案。
  • RE:你不能修复 JavaScript。它看起来像这样(非常简化): var myString = "XElelent.value 和其他一些用撇号标记的动态值。在 XElement.value 中有一个杂散撇号会导致 JavaScript 错误。";

标签: c# xml encoding xelement


【解决方案1】:

这是正确的行为。在允许' 的地方,它的作用与&amp;apos;&amp;#39;&amp;#x27; 相同。如果你想在 XML 中包含文字字符串 &amp;#39;,你应该对 &amp; 进行编码:

originalXML.Replace("'", "&amp;#39;")

或者解析原始 XML 并修改:

XElement xe = XElement.Parse(originalXML);

var data = xe.Element("data");

data.Value = data.Value.Replace("'", "&#39;");

但是这样做似乎真的很奇怪。对于您要解决的问题,也许有更好的解决方案。

此外,这种编码不是“ASCII 等价的”,它们被称为character entity references。数字是基于字符的 Unicode 代码点。

【讨论】:

  • 谢谢!我已经编辑了问题以反映正确的命名:“字符实体引用”
  • RE:“也许有更好的解决方案……”我愿意接受建议!源 XML 字符串可能包含撇号。它需要存储在 XElement 中,并且 不得 包含撇号。此外,XElement 中的值也应该是 HTML 编码的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2017-12-24
  • 2012-01-21
相关资源
最近更新 更多