【发布时间】:2019-06-04 05:25:24
【问题描述】:
已经有一些关于将 XML 解析为 JSON 的帖子,但我还没有遇到跳过验证 XML 并在 C# 中正确转换为 JSON 的情况。
我想使用 Json.NET 将(无效的)XML 代码转换为 JSON。 XML 包含特殊字符,例如:
<send to> 中的空格,<body/content> 中的斜线,!在<!priority>。
在 C# 中,XDocument.Parse(xmlString) 始终验证 XML,因此转换将引发异常。使用HtmlUtility 进行解码/编码会影响 XML 标记 ,我无法使用它。我怎样才能做到这一点?
一些示例代码可以在下面找到。
输入(字符串):
<root>
<message>
<send to>some@email.com</send to>
<body/content>This is a message!</body/content>
<!priority>high</!priority>
</message>
</root>
预期输出(字符串):
{
"root": {
"message": {
"send to": "some@email.com",
"body/content": "This is a message!",
"!priority": "high"
}
}
}
【问题讨论】:
-
那不是有效的 xml.... 你可能想写你自己的解析器。
-
我知道这是无效的 XML,但需要将其转换为 JSON 输出。您是否有建议如何使用有效的 XML(到 JSON)正确转换它? (输出需要保持不变,所以使用空格、! 和斜杠)
-
“跳过验证 XML”(即这里或那里奇怪的不受支持的实体)是一回事,而通过包含不包含字符的标签来读取公然违反 XML 标准的内容则是另一回事允许。即使是手动环绕
XmlReader的东西,后者也很难卖。你当然要很多更好地从源头上解决这个问题——解析它比生成它要困难得多。如果有东西愿意吐出“不是 XML”,它可能会被哄着吐出“请只是一个键值对列表”。 -
使用正则表达式 (ducks and runs)...
-
问题不在于“特殊字符”,而是首先解析标签——它看起来像 XML,但不是。例如,解析器需要看到
<body/content>是一个名称无效的标签,而不像</content>那样关闭一个元素。如建议的那样,如果没有像/root或>good luck!<这样的元素这样令人讨厌的意外,您可以使用正则表达式来匹配它,或者编写自己的小型递归下降解析器,或者使用一系列.Replace调用来替换有问题的如果它们来自一个小列表,则名称(然后照常读取 XML,并手动生成 JSON)。