如何在XQuery中将指定XML转换为目标JSON格式?
解决XQuery中
fn:xml-to-json报FOJS0006错误的XML转JSON方法 问题背景
你提供的原始XML:
<?xml version="1.0" encoding="UTF-8"?> <groups> <group name="group1" location="city1">Group1</group> <group name="group2" location="city2">Group2</group> </groups>
期望转换为的JSON:
{ "groups": [ { "name": "group1", "location": "city1" }, { "name": "group2", "location": "city2" } ] }
调用fn:xml-to-json(/xml)时触发FOJS0006 xml-to-json: element found in wrong namespace异常,原因是**fn:xml-to-json要求输入XML必须属于特定的JSON映射命名空间(http://www.w3.org/2005/xpath-functions/json)**,普通XML无法直接被该函数解析。
方案1:转换为命名空间规范的XML后再调用xml-to-json
将原始XML重构为符合命名空间要求的结构,明确XML节点与JSON类型的对应关系:
declare namespace json="http://www.w3.org/2005/xpath-functions/json"; let $original-xml := <groups> <group name="group1" location="city1">Group1</group> <group name="group2" location="city2">Group2</group> </groups> let $json-compatible-xml := <json:map> <json:array key="groups"> { for $group in $original-xml/group return <json:map> <json:string key="name" data="{$group/@name}"/> <json:string key="location" data="{$group/@location}"/> </json:map> } </json:array> </json:map> return fn:xml-to-json($json-compatible-xml)
方案2:手动构造JSON(更灵活,XQuery 3.1+适用)
利用XQuery的map类型和json:serialize函数直接生成目标JSON,无需依赖特定命名空间:
let $original-xml := <groups> <group name="group1" location="city1">Group1</group> <group name="group2" location="city2">Group2</group> </groups> let $groups-data := for $group in $original-xml/group return map { "name": string($group/@name), "location": string($group/@location) } return json:serialize( map { "groups": $groups-data }, map { "indent": true() } // 开启缩进,生成格式化的JSON )
方案对比
- 方案1严格遵循W3C的XML-to-JSON映射规范,适合标准化场景;
- 方案2更直观,完全匹配你的输出需求,且代码可读性更高。
内容的提问来源于stack exchange,提问作者Ock
相关产品推荐
相关产品推荐

