获取xml文件中的指定标签的值

  1. 假设下面的xml名字为tagNames(已经转为String类型的字符串了)请获取指定标签内容

<XYR>

<XYRXX>

<R>

<XYRJBXX>

<XTDXBH/>

<GAXYRBH>01</GAXYRBH>

<JCYXYRBH>02</JCYXYRBH>

<XYRXM>张三</XYRXM>

<ZJLX/>

</XYRJBXX>

</R>

<R>

<XYRJBXX>

<XTDXBH/>

<GAXYRBH>001</GAXYRBH>

<JCYXYRBH>002</JCYXYRBH>

<XYRXM>李四</XYRXM>

<ZJLX/>

</XYRJBXX>

</R>

<R>

<XYRJBXX>

<XTDXBH/>

<GAXYRBH>0001</GAXYRBH>

<JCYXYRBH>0002</JCYXYRBH>

<XYRXM>王五</XYRXM>

<ZJLX/>

</XYRJBXX>

</R>

</XYRXX>

</XYR>

  1. 传入参数

String tagNames = "<XTDXBH>,<GAXYRBH>,<JCYXYRBH>,<XYRXM>,<ZJLX>"

  1. 方法实现
public static JSONArray getParentXml(Long parentXtid, String tagNames) {
        XXXService XXXService = SpringUtil.getBean(XXXService.class);
        LambdaQueryWrapper<XXX> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(XXX::getId, parentXtid);
        XXX result = XXXService.getBaseMapper().selectOne(wrapper);
        // 获取父节点的xml数据
        String originalXml = result.getOriginalData();
       // 获取匹配的数量
        int matcheNum = 0;
        List<String> tagList = Arrays.asList(tagNames.split(","));
        for (String tag : tagList) {
            int index = originalXml.indexOf(tag);
            // 按照传入的标签格式,如果是闭标签将匹配不到该标签,所以要循环找到非闭标签
            if (index != -1) {
                String[] split = originalXml.split(tag);
                matcheNum = split.length - 1;
                break;
            }
        }

        // 循环找出传入匹配标签值
        for (Integer i = 0; i < matcheNum; i++) {
            JSONArray xmlArr = new JSONArray();
            for (String tagBegin : tagList) {
                // 结束标签
                StringBuilder tagEnd = new StringBuilder(tagBegin);
                tagEnd = tagEnd.insert(1, "/");

                Integer indexStart = 0;
                Integer indexEnd = 0;
                JSONObject R = new JSONObject();
                ArrayList<Integer> indexStartList = new ArrayList<>();
                while ((indexStart = originalXml.indexOf(tagBegin, indexStart)) >= 0) {
                    indexStartList.add(indexStart);
                    indexStart = indexStart + tagBegin.length();
                }
                ArrayList<Integer> indexEndList = new ArrayList<>();
                while ((indexEnd = originalXml.indexOf(tagEnd.toString(), indexEnd)) >= 0) {
                    indexEndList.add(indexEnd);
                    indexEnd = indexEnd + tagEnd.length();
                }

                // 如果是闭标签例如<XYRLXDM/>,则找不到匹配的标签返回空字符串
                if (CollectionUtils.isEmpty(indexStartList)) {
                    R.put(tagBegin.substring(1, tagBegin.length()-1), "");
                    xmlArr.add(R);
                } else {
                    Integer start = indexStartList.get(i);
                    Integer end = indexEndList.get(i);
                    String value = originalXml.substring((start + tagBegin.length()), end);
                    // 去掉<>符号后作为key
                    R.put(tagBegin.substring(1, tagBegin.length()-1), value);
                    // 多人的情况
                    xmlArr.add(R);
                }
            }
            return xmlArr;
        }
        return null;
      }
    }
  1. 返回结果

[{"XTDXBH":""},{"GAXYRBH":"01"},{"JCYXYRBH":"02"},{"XYRXM":"张三"},{"ZJLX":""}]

[{"XTDXBH":""},{"GAXYRBH":"001"},{"JCYXYRBH":"002"},{"XYRXM":"李四"},{"ZJLX":""}]

[{"XTDXBH":""},{"GAXYRBH":"0001"},{"JCYXYRBH":"0002"},{"XYRXM":"王五"},{"ZJLX":""}]

  1. 在ftl中应用该方法拿到上一个节点的ftl文件数据填充到此节点中
<#assign ryxxList=xyrxxUtil.getParentXml(parentId, "<XTDXBH>,<JCYXYRBH>,<GAXYRBH>,<XYRXM>,<ZJLX>")!/>
  <XYRXX>
   <#if ryxxList?? && (ryxxList?size > 0)>
    <#list ryxxList as ryxx>
     <R>
      <XYRJBXX>
      <XTDXBH>${(ryxx.XTDXBH)!}</XTDXBH>
      <XYRBGRJBXXBH>${(ryxx.XYRBGRJBXXBH)!}</XYRBGRJBXXBH>
      <FYBGRBH>${(ryxx.FYBGRBH)!}</FYBGRBH>
      <JCYXYRBH>${(ryxx.JCYXYRBH)!}</JCYXYRBH>
      <GAXYRBH>${(ryxx.GAXYRBH)!}</GAXYRBH>
      <XM req="true" msg="XM不能为空">${(ryxx.XM)!}</XM>
      <ZJLX req="true" msg="ZJLX不能为空">${(ryxx.ZJLX)!}</ZJLX>
      </XYRJBXX>
    </R>
    </#list>
    </#if>
  </XYRXX>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值