假设下面的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>
传入参数
String tagNames = "<XTDXBH>,<GAXYRBH>,<JCYXYRBH>,<XYRXM>,<ZJLX>"
方法实现
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;
}
}
返回结果
[{"XTDXBH":""},{"GAXYRBH":"01"},{"JCYXYRBH":"02"},{"XYRXM":"张三"},{"ZJLX":""}]
[{"XTDXBH":""},{"GAXYRBH":"001"},{"JCYXYRBH":"002"},{"XYRXM":"李四"},{"ZJLX":""}]
[{"XTDXBH":""},{"GAXYRBH":"0001"},{"JCYXYRBH":"0002"},{"XYRXM":"王五"},{"ZJLX":""}]
在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>