【问题标题】:How to convert invalid XML with special characters to JSON with Json.NET [duplicate]如何使用 Json.NET 将带有特殊字符的无效 XML 转换为 JSON [重复]
【发布时间】: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,但不是。例如,解析器需要看到&lt;body/content&gt; 是一个名称无效的标签,而不像&lt;/content&gt; 那样关闭一个元素。如建议的那样,如果没有像 /root&gt;good luck!&lt; 这样的元素这样令人讨厌的意外,您可以使用正则表达式来匹配它,或者编写自己的小型递归下降解析器,或者使用一系列 .Replace 调用来替换有问题的如果它们来自一个小列表,则名称(然后照常读取 XML,并手动生成 JSON)。

标签: c# xml json.net


【解决方案1】:

不要将其视为“无效的 XML”,将其视为与 XML 完全无关的专有语法。没有 XML 工具可以帮助您解决这个问题。您首先需要为非 XML 文件定义一个语法,然后您需要为该语法编写一个解析器。编写该解析器后,您可以直接生成 JSON,也可以生成 XML 并使用现成的 XML-to-JSON 转换器。

或者,如果可能,请停止使用专有语法并改用 XML 和 JSON 等标准。大多数人在 20 年前就这样做了,并且在此过程中为自己节省了很多钱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2022-08-04
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多