XML解析·结点下多组同名子节点数据解析

在进行XML解析时,往往会遇到某个结点下有多组同名子节点数据的情况,如:

<xml>
……
     <gfrs>
			<gfr>
				<gfrxm>66</gfrxm>
				<zjhm>12345</zjhm>
			</gfr>
			<gfr>
				<gfrxm>67</gfrxm>
				<zjhm>1209812</zjhm>
			</gfr>
     </gfrs>
……
</xml>

具体解析代码如下:

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author : chenfan
 * @className : TestXml
 * @date : Created in 2022/5/12 16:26
 * @description :
 */
public class TestXml {
    public static List<Map> xml2Maps(Element root) {
        List<Map> list = new ArrayList<>();
        try {
            List<Element> gftElements = root.elements();
            for(Element gfrElement : gftElements){
                Map<String, Object> map = new HashMap<>();
                List<Element> elements = gfrElement.elements();
                for(Element element : elements){
                    map.put(element.getName(), element.getStringValue());
                }
                list.add(map);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    public static Map xml2Map(String xmlStr){
        Map<String, Object> map = new HashMap<>();
        try {
            Document doc = DocumentHelper.parseText(xmlStr);
            Element root = doc.getRootElement();
            Element body = root.element("body");
            //获取body下所有元素
            List<Element> bodyElements = body.elements();
            for(Element element : bodyElements){
                if("gfrs".equals(element.getName())){
                    //对gfrs单独解析
                    map.put(element.getName(), xml2Maps(element));
                }else{
                    map.put(element.getName(), element.getStringValue());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
    
    public static void main(String[] args) {
        String xml =    "<xml>\n" +
                        "\t<header>\n" +
                        "\t\t<status>1</status>\n" +
                        "\t\t<message>数据信息处理成功!</message>\n" +
                        "\t</header>\n" +
                        "\t<body>\n" +
                        "\t\t<jgbh>20210019</jgbh>\n" +
                        "\t\t<czsj>2021-06-08 15:06:22</czsj>\n" +
                        "\t\t<gfrs>\n" +
                        "\t\t\t<gfr>\n" +
                        "\t\t\t\t<gfrxm>66</gfrxm>\n" +
                        "\t\t\t\t<zjhm>12345</zjhm>\n" +
                        "\t\t\t</gfr>\n" +
                        "\t\t\t<gfr>\n" +
                        "\t\t\t\t<gfrxm>67</gfrxm>\n" +
                        "\t\t\t\t<zjhm>1209812</zjhm>\n" +
                        "\t\t\t</gfr>\n" +
                        "\t\t</gfrs>\n" +
                        "\t\t<htze>80000</htze>\n" +
                        "\t</body>\n" +
                        "</xml>";
        Map<String, Object> map = new HashMap<>();
        map = xml2Map(xml);

        List<Map> list = (List)map.get("gfrs");
        System.out.println(list.size());
        for(Map tmpMap : list){
//                tmpMap.get("gfrxm");
//                tmpMap.get("zjhm");
            System.out.println(xml);
            System.out.println("gfrxm:"+tmpMap.get("gfrxm"));
            System.out.println("zjhm:"+tmpMap.get("zjhm"));
        }
    }
    
}

运行结果:

"C:\Program Files (x86)\Java\jdk1.8.0_74\bin\java.exe"...
<xml>
	<header>
		<status>1</status>
		<message>数据信息处理成功!</message>
	</header>
	<body>
		<jgbh>20210019</jgbh>
		<czsj>2021-06-08 15:06:22</czsj>
		<gfrs>
			<gfr>
				<gfrxm>66</gfrxm>
				<zjhm>12345</zjhm>
			</gfr>
			<gfr>
				<gfrxm>67</gfrxm>
				<zjhm>1209812</zjhm>
			</gfr>
		</gfrs>
		<htze>80000</htze>
	</body>
</xml>
2
gfrxm:66
zjhm:12345
gfrxm:67
zjhm:1209812

Process finished with exit code 0

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值