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

本文关键字:转义 字符 属性 何处理 处理 XML | 更新日期: 2023-09-27 18:09:34

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

字符串基本上是这样读的:

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

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

抛出以下错误:

'Quote'是一个意外的标记。期待留白。第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解析它?

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

你作为XML发布的字符串是在调试时检查Visual Studio中的一些变量,对吗?

嗯,Visual Studio自动转义双引号,所以你可以很容易地将这个值复制到c#代码中。实际上,XML并不包含所有这些"组",而只是包含"组"。所以不要用" it contains "。你的实际问题在这里:

"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."

问题是"Quote"双引号字符串在另一个双引号字符串中。因此,出现了Quote相关的错误。字符串在Quote开始的地方结束。这是一个意想不到的标志。XML提供程序实际上没有转义围绕在Quote word周围的双引号

我有一些XML返回作为一个字符串从web服务(不幸的是我无法控制它如何回到我身边。它通常是有效的XML,但有时我会收到一些稍微无效的文件导致这个问题)。

不,您没有XML。您所拥有的是似乎打算成为XML的文本,但没有满足格式良好的规则(顺便说一下,这与有效的规则不同)。它不是XML。这里没有一致的XML处理器可以帮助您。

完全正确的方法是通知web服务的所有者他们的服务坏了。它们必须转义属性中嵌入的引号,或者使用相反的引号样式(单引号与双引号字符),或者对包含引号字符的数据使用元素。他们不能只是把任何东西都转储到一个属性值中,然后期待最好的结果。

可能建议您尝试将文本修复为格式良好的XML。请拒绝,除非您喜欢玩打地鼠游戏,因为XML推荐可以被无限地忽略。