0

我们有一个接受 XML、JSON、SQL、OData 等数据的程序。对于 XML,我们使用 Saxon 及其 XPath 支持,效果非常好。

对于 JSON,我们使用不如 XPath 3.1 强大的jsonPath 库。并且 jsonPath 在某些极端情况下有点松鼠。

那么......如果我们将我们得到的 JSON 转换为 XML 然后使用 Saxon 会怎样?这种方法有限制吗?是否存在不会转换为 XML 的 JSON 结构,例如匿名数组?

4

2 回答 2

3

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

为方便起见,以一定的代价实现了无损。例如,JSON 属性名称不会转换为 XML 元素或属性名称,而是转换为key属性的值。

于 2020-08-10T08:11:16.580 回答
1

许多不同的人提出了许多不同的 JSON 到 XML 的转换。正如已经指出的那样,XPath 3.1 和 XSLT 3.0 规范具有无损、往返转换,json-to-xml并且xml-to-json可以处理任何 JSON。

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

最后我猜你想选择简单转换会给你foo的属性;在 XPath 3.1 中,您需要XDM 映射或结果格式。{ "foo" : "value" }foo?foofn:string[@key = 'foo']json-to-xml

对于{ "prop 1" : "value" }后一种仍然是 as fn:string[@key = 'prop 1']?方法需要更改为?('prop 1')or .('prop 1')。任何在元素名称中转义空格的转换都需要您将路径更改为 eg prop_1

我认为所有类型的 JSON 都没有理想的方法,最终它取决于您期望的 JSON 格式以及用户学习新的选择/查询方法的意愿或时间。

当然,您可以使用其他 JSON 到 XML 的转换json-to-xml,然后在任何 XML 格式上使用 XPath 3.1;我认为这就是 oXygen 人所选择的,他们在 XPath 3.1 提供之前进行了一些 JSON 到 XML 的转换,并且主要坚持使用它,所以在 oXygen 中,您可以针对 JSON 编写“路径”表达式,因为路径是在引擎盖下被评估的针对 JSON 的 XML 转换。我不确定要通过 XML 格式的 XPath 路径表达式选择原始 JSON 中的哪些 JSON 值,这可能不是那么容易和直接。

于 2020-08-09T20:00:51.457 回答