如何处理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("'"", """);
(以及许多其他组合,如(Replace(@"""", "")
,等)
抛出错误:
"'&'是一个意外的标记。期望的令牌是''"'或"'。1号线,15号位置。"}
我也试过xmlString = SecurityElement.Escape(xmlString);
(它抛出与上面相同的错误)。我还尝试使用XmlWriter/Reader来修改字符串,但是当它到达违规元素时,阅读器会抛出错误。
我的下一个猜测是使用正则表达式将嵌套的引号转换为单引号,但RegEx对我来说有点陌生。我如何解决这个问题,以便我可以使用XDocument.Parse
解析它?
你作为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推荐可以被无限地忽略。