我们有一个程序,可以接受XML、JSON、SQL、OData等作为数据。对于XML,我们使用Saxon及其XPath支持,这非常有效。
对于JSON,我们使用的jsonPath库不如XPath3.1强大。在某些角落的情况下,jsonPath有点古怪。
所以。。。如果我们将得到的JSON转换为XML,然后使用Saxon呢?这种方法有局限性吗?是否存在不会像匿名数组那样转换为XML的JSON构造?
标题问题:XPath 3.1中的json-to-xml()
函数是无损的,只是默认情况下,XML中无效的字符(如NUL或未配对的代理(会被SUB字符替换——您可以使用escape=true选项来更改这种行为。
这种损失是以便利为代价实现的。例如,JSON属性名称不会转换为XML元素或属性名称,而是转换为key
属性的值。
许多不同的人提出了许多不同的JSON到XML的转换。如前所述,XPath3.1和XSLT3.0规范使用json-to-xml
和xml-to-json
进行了无损耗的往返转换,可以处理任何JSON。
有一些更简单的转换可以处理有限的JSON集,主要问题是如何表示JSON中不映射到XML名称的属性名称,例如{ "prop 1" : "value" }
由json-to-xml
表示为<string key="prop 1">value</string>
,而试图将属性名称映射到元素或属性名称的转换要么无法创建格式良好的XML(例如<prop 1>value</prop 1>
(,要么必须转义元素名称中的空格(例如<prop_1>value</prop_1>
或插入空间的Unicode的某些十六进制表示(.
最后,我想你想选择{ "foo" : "value" }
中的属性foo
作为foo
,简单的转换会给你;在XPath3.1中,XDM映射需要?foo
,json-to-xml
结果格式需要fn:string[@key = 'foo']
。
对于{ "prop 1" : "value" }
,后一种保留为fn:string[@key = 'prop 1']
,?
方法需要更改为?('prop 1')
或.('prop 1')
。任何转义了元素名称中空格的转换都需要将路径更改为例如prop_1
。
对于所有类型的JSON,我认为没有理想的方法,最终它取决于您期望的JSON格式以及用户学习新的选择/查询方法的意愿或时间。
当然,您可以使用json-to-xml
以外的其他JSON到XML转换,然后在任何XML格式上使用XPath3.1;我认为这就是oXygen的选择,在XPath3.1提供JSON到XML转换之前,他们已经进行了一些JSON到XML的转换,并且主要坚持使用它,所以在oXygn中,您可以编写";路径";针对JSON的表达式,就像在引擎盖下一样,根据JSON的XML转换来评估路径。我不确定用XML格式的XPath路径表达式来指示原始JSON中的哪些JSON值,这可能不是那么简单明了。