You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Velocity模板将XML对象转换为JSON格式

Velocity模板实现XML转JSON实操方案

前置准备

  • 提前将输入XML解析为Velocity上下文可访问的对象,常用Dom4j、JAXB等工具完成解析,将解析后的根节点放入上下文,命名为$xmlRoot即可
  • 封装XPath取值工具类放入Velocity上下文,命名为$xpathUtil,简化模板内节点取值逻辑
  • 建议将org.apache.velocity.tools.generic.EscapeTool实例放入上下文,命名为$esc,用于处理JSON特殊字符转义

基础模板编写规则

1. 固定结构+动态取值

直接在模板中写JSON的固定外壳,需要动态取值的位置替换为Velocity变量即可,字符串类型字段需要加双引号,数值、布尔类型不需要加引号。

注意:所有字符串类型的取值都需要用$esc.javaScript转义,避免双引号、换行、斜杠等特殊字符导致JSON格式非法。

单字段取值示例

假设XML结构为:

<order>
  <order_id>12345</order_id>
  <order_amount>99.9</order_amount>
  <order_remark>测试"备注"</order_remark>
</order>

对应模板写法:

{
  "orderId": "$esc.javaScript($xpathUtil.getText($xmlRoot, "//order/order_id"))",
  "orderAmount": $xpathUtil.getText($xmlRoot, "//order/order_amount"),
  "orderRemark": "$!esc.javaScript($xpathUtil.getText($xmlRoot, "//order/order_remark"))"
}

空值场景用$!{变量名}语法,变量为空时输出空字符串而非Velocity变量标识。

2. 列表循环写法

如果需要解析XML中的重复节点生成JSON数组,用#foreach指令循环处理,通过$foreach.index判断是否加逗号,避免数组末尾多余逗号导致JSON非法。

列表字段示例

假设XML包含商品列表节点:

<order>
  <order_id>12345</order_id>
  <goods_list>
    <goods>
      <goods_id>1</goods_id>
      <goods_name>测试商品1</goods_name>
    </goods>
    <goods>
      <goods_id>2</goods_id>
      <goods_name>测试商品2</goods_name>
    </goods>
  </goods_list>
</order>

对应模板写法:

{
  "orderId": "$esc.javaScript($xpathUtil.getText($xmlRoot, "//order/order_id"))",
  "goodsList": [
    #set($goodsNodes = $xpathUtil.getNodes($xmlRoot, "//order/goods_list/goods"))
    #foreach($goods in $goodsNodes)
      #if($foreach.index > 0),#end
      {
        "goodsId": "$esc.javaScript($xpathUtil.getText($goods, "goods_id"))",
        "goodsName": "$esc.javaScript($xpathUtil.getText($goods, "goods_name"))"
      }
    #end
  ]
}

3. 嵌套结构处理

多层嵌套XML节点的处理逻辑和单节点、列表逻辑完全一致,逐层取出对应节点输出即可,不需要额外特殊处理。

内容的提问来源于stack exchange,提问作者Amit Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:45:03