我有一些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("\"", """);
(以及许多其他组合,如(Replace(@"""", "")
等)
引发错误:
“ '&安培;'是一个意外的令牌。预期的令牌是'\''或'''。第1行,第15位。“}
我也试过xmlString = SecurityElement.Escape(xmlString);
(它抛出与上面相同的错误)。我也尝试使用XmlWriter / Reader来修改字符串,但是当读者到达有问题的元素时会抛出错误。
我的下一个猜测是使用正则表达式将嵌套引号转换为单引号,但RegEx对我来说很陌生。我该如何解决这个问题,以便我可以使用XDocument.Parse
解析它?
答案 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-Mole,XML Recommendation可以被忽略。