JSON 到 XML 会让我失去什么吗?

Does JSON to XML lose me anything?

我们有一个程序接受数据 XML、JSON、SQL、OData 等。对于 XML 我们使用 Saxon 及其 XPath 支持和太棒了。

对于JSON,我们使用jsonPath library,它不如XPath 3.1 强大。而且 jsonPath 在某些特殊情况下有点松鼠。

那么...如果我们将 JSON 转换为 XML 然后使用撒克逊语呢?这种方法有限制吗?是否有 JSON 构造不会转换为 XML,如匿名数组?

许多不同的人想出了很多从 JSON 到 XML 的不同转换。正如已经指出的那样,XPath 3.1 和 XSLT 3.0 规范具有 loss-less、round-tripping 与 json-to-xmlxml-to-json 的转换,可以处理任何 JSON。

有一些更简单的转换可以处理有限的 JSON 集,主要问题是如何表示 JSON 的 属性 名称不映射到 XML名称,例如{ "prop 1" : "value" }json-to-xml 表示为 <string key="prop 1">value</string>,而尝试将 属性 名称映射到元素或属性名称的转换要么无法创建 well-formed XML(例如 <prop 1>value</prop 1>)或必须转义元素名称中的 space(例如 <prop_1>value</prop_1> 或插入的 space 的 Unicode 的某种十六进制表示)。

最后我猜你想要 select { "foo" : "value" } 中的 属性 foo 作为 foo ,简单的转换会给你;在 XPath 3.1 中,XDM 映射需要 ?foojson-to-xml 结果格式需要 fn:string[@key = 'foo']

{ "prop 1" : "value" }后一种保持为fn:string[@key = 'prop 1']?方法需要更改为?('prop 1').('prop 1')。任何在元素名称中转义 space 的转换都需要您将路径更改为例如prop_1.

所有的方法都没有理想的JSON我认为,最终取决于你期望的JSON格式和用户学习新的[=的意愿或时间] 42=]方法。

当然,除了 json-to-xml 之外,您还可以使用其他 JSON 到 XML 的转换,然后在任何 XML 格式上使用 XPath 3.1;我认为这是 oXygen 的人选择的,在 XPath 3.1 提供之前他们有一些 JSON 到 XML 的转换并且主要坚持它,所以在 oXygen 中你可以写“路径”表达式反对 JSON 因为在引擎盖下,路径是根据 JSON 的 XML 转换进行评估的。我不确定需要付出多少努力才能指示原始 JSON 中的哪些 JSON 值已被 XML 格式的 XPath 路径表达式 selected,这可能不是就这么简单直接。

标题问题:XPath 3.1中的json-to-xml()函数是无损的,除了默认情况下,XML中无效的字符(例如NUL,或未配对的代理)被替换为SUB 字符——您可以使用选项 escape=true 更改此行为。

无损是为了方便而付出了一些代价。例如,JSON 属性 名称不会转换为 XML 元素或属性名称,而是转换为 key 属性的值。