如何在XML属性值中处理未转义的引号字符?

时间:2015-08-22 23:10:23

标签: c# regex xml string

我有一些XML作为来自Web服务的字符串返回(遗憾的是我无法控制它是如何返回给我的。它通常是有效的XML,但有时我会收到一些稍微无效的,这会导致这个问题)。

该字符串基本上如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<STATUS _Description="...will contact you with a ("Quote") when ..." />

当我尝试:XDocument.Parse(xmlString);

它会抛出以下错误:

  

'引用'是一个意外的令牌。期待白色空间。第15行,第113位。

这是可以预料到的,但我无法弄清楚正确的字符串操作来修复它。我尝试过很多东西,包括:

static string RemoveInvalidXmlChars(string xmlString)
{
  var validXmlChars = xmlString.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray();
  return new string(validXmlChars);
}

并且:xmlString = xmlString.Replace("\"", "&quot;");(以及许多其他组合,如(Replace(@"""", "")等)

引发错误:

  

“ '&安培;'是一个意外的令牌。预期的令牌是'\''或'''。第1行,第15位。“}

我也试过xmlString = SecurityElement.Escape(xmlString);(它抛出与上面相同的错误)。我也尝试使用XmlWriter / Reader来修改字符串,但是当读者到达有问题的元素时会抛出错误。

我的下一个猜测是使用正则表达式将嵌套引号转换为单引号,但RegEx对我来说很陌生。我该如何解决这个问题,以便我可以使用XDocument.Parse解析它?

2 个答案:

答案 0 :(得分:2)

您作为XML发布的字符串来自于在调试时检查Visual Studio中的某些变量,对吗?

嗯,Visual Studio auto会自动转义双引号,因此您可以轻松地将该值复制到c#代码中。实际上,您的XML并不包含所有这些\&#34;团体,而只是&#34;。所以不是\&#34;它包含&#34;。你的实际问题在这里:

"Thank you for your order! The order is currently being reviewed by a moderator. A moderator will contact you with a ("Quote") when the review is complete."

问题出在&#34;引用&#34;另一个双引号字符串中的双引号字符串。因此,报价相关的错误。字符串在Quote开始的地方结束。它看起来像是一个意外的象征。您的XML提供程序实际上没有转义引用单词周围的双引号。

答案 1 :(得分:2)

  

我有一些XML作为字符串从webservice返回(不幸的是   我无法控制它是如何归还给我的。它通常是有效的   XML,但有时我会收到一些稍微无效的内容   导致这个问题)。

不,你没有XML。你所拥有的是看起来像XML的文本,但却没有达到 格式良好 which, by the way, are different from the rules for being valid)的规则。 不是XML。没有符合条件的XML处理器可以帮助您。

完全正确的方法是通知网络服务的所有者他们的服务已被破坏。它们必须转义嵌入在属性中的引号,或使用相反的引用样式(单引号和双引号字符),或使用包含引号字符的数据的元素。他们不能只将任何东西转储到属性值中,并希望最好。

可能会建议您尝试将文本修复为格式良好的XML。拒绝,除非您喜欢以无限的方式玩Whac-A-MoleXML Recommendation可以被忽略。