遍历xml多级树形结构

本文介绍了在Java中解析XML树形结构,对比了DOM、SAX、JDOM和DOM4J等解析方式,并推荐DOM4J因其性能优势。提供了针对多级XML结构的解决方案,通过DOM4J的.elements()方法逐级遍历节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

解析XML树形结构的思路:
XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。
  XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。


方法选择:

  DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
  JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
  SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。


解决方案:

需要解析如下结构的xml文件

<root>
    <system number="1" taskcode ="XX11" coderegion="0" type = "1">
        <first-system number="1" code="R" name="测试软件">
            <second-system number="1" name="2">
                <third-system number="1" code="R" name="测试软件">
                    <element number="1" code="RX" name="软件"></element>
                    <element number="3" code="2" name="2"></element>
                </third-system>
            </second-system>
        </first-system>
    </system>
</root>

废话不多说上代码:

    public static String verifyCproduct(List<String> list) {
        SAXReader reader = new SAXReader();

        File file = new File("./configuration.xml");
        try {
            Document document = reader.read(file);
            //获取根root
            Element root = document.getRootElement();
            //获取第一级system
            List<Element> systemElements = root.elements();
            for (Element system: systemElements) {
            	//获取第二级firstSystem
                List<Element> firstSystemElements = system.elements();
                for (Element firstSystem: firstSystemElements) {
                	//获取第三级secondSystem
                    List<Element> secondSystemElements = firstSystem.elements();
                    for (Element secondSystem: secondSystemElements){
       				//获取第四级thirdSystem
                        List<Element> thirdSystemElements = secondSystem.elements();
                        for (Element thirdSystem: thirdSystemElements){
                         //获取最后一级,对其中的属性进行判断
                            List<Element> Elements = secondSystem.elements();
                            for (Element element: Elements){
                                //判断名称以及代号是否一致
                                if (list.get(8).equals(element.attributeValue("code")) && list.get(7).equals(element.attributeValue("name"))){
                                    return  "验证成功";
                                }
                            }
                        }
                    }
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return "未在配置中查询到相关信息,验证失败";
    }

代码分析:

如果需要使用到dom4j,这部分代码是通用的,然后就是通过一级向下调用。

        SAXReader reader = new SAXReader();        // 创建SAXReader的对象reader
        File file = new File("./configuration.xml");
        Document document = reader.read(file);            // 通过reader对象的read方法加载.xml文件,获取docuemnt对象。

一级一级调用就是通过.elements方法获取下一级,将下面所有元素以list形式存储。

		List<Element> systemElements = root.elements();//就是获取root下面的element
		//已知属性名情况下
        System.out.println("name: " + systemElements.attributeValue("name"));
       //已知子元素名的情况下
        System.out.println("title" + child.elementText("title"));

如果有什么问题或者写的不好请发消息给我 ,感谢!附上jar包下载地址
链接:https://pan.baidu.com/s/16GCgCpaF7dc33pMbK2sTLg
密码:z444


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值