解析xml并去读写相应数据

本文详细介绍了如何使用DOM4J解析XML字符串,包括查找节点的两种方法、理解XML的层级关系,展示了修改XML属性值和添加节点的步骤,并探讨了将字符串转换为XML文件的方法。同时,讨论了四种主流的XML解析方法,推荐使用DOM4J,因其性能优越且广泛应用于开源项目。

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

一、解析xml字符串步骤

有些比较老的服务会通过传输xml字符串来进行传递参数

对于这种场景,(在此采用dom4j的方式解析)获取数据步骤如下:

    //将xml字符串转为Document格式
    Document doc = DocumentHelper.parseText(xml_String);
    //定位获取某节点
    Node node = doc.selectSingleNode("/MESSAGE/DATASET/DATA/ITEM[3]");
    //强制转为element元素
    Element element = (Element) node;
    //根据元素获取属性对应值
    String messageSequence = element.attribute(1).getValue();

说明一点:查找节点,分为两种查找

(1)一层一层遍历,直到找到对应节点----------前提是不清楚xml结构或者xml结构会变化

(2)根据层级关系直接查找单个节点Node-----------前提当然是已知xml结构并且xml结构不会变化

   Node node = doc.selectSingleNode("/MESSAGE/DATASET/DATA/ITEM[3]");

 


二、在此单独说一下xml的层级关系以及节点内的层级关系:

xml其实有和html类似的标签关系,一出便成对存在或者以/>结尾

(1)对于标签名,同一父标签下的相同子标签,可以使用数组的形式获取,如第一个item:ITEM[1]。下标从1开始

(2)对于属性值,同一标签下的标签,可以使用element.attribute(i)的方式获取,如第二个属性val,element.attribute(1).getValue()下标是从0开始的


三、xml示例如下

<?xml version="1.0" encoding="UTF-8"?>
<MESSAGE>
    <DATASET name="data1" asd="asd">
        <DATA>
            <ITEM key="AAA" val="001" aaa="aaa"/>
            <ITEM key="BBB" val="002" bbb="bbb"/>
        </DATA>
    </DATASET>

    <DATASET name="data2">
        <DATA>
            <ITEM key="CCC" val="003"/>
            <CONDITION rel="PPP">
                <CONDITION rel="QQQ">
                    <ITEM key="DDD" val="004"/>
                </CONDITION>
                <ITEM key="EEE" val="005"/>
                <ITEM key="FFF" val="006"/>
 	            <CONDITION rel="OOO">
		            <ITEM key="GGG" val="007"/>
		            <ITEM key="HHH" val="008"/>
	             </CONDITION>
            </CONDITION>
        </DATA>
    </DATASET>
</MESSAGE>

四、修改xml属性值步骤

废话不多说先上代码

     SAXReader reader = new SAXReader();
     //将文件读取为Document
     Document document = reader.read(new    File("src/main/resources/static/response.xml"));
     //定位到某个节点
     Node node = document.selectSingleNode("/MESSAGE/DATASET/DATA/ITEM[1]");
     //将节点强制转为元素
     Element element = (Element) node;
     //查找属性并设置值
     element.attribute(2).setValue("123456");
     //查找属性并打印获取属性值
     System.out.print(element.attribute(2).getValue());
     //将修改后的xml转为字符串
     String res = document.asXML();
     System.out.print(res);

说一点注意点:获取文件路径通常分为相对路径和绝对路径,今天测试使用相对路径获取的时候一直报找不到文件,尝试采用项目根路径来获取就可以。等有时间必须分析一下这个问题


五、添加节点

1、在父节点依次在最下方添加子节点


            /**
             * 读取xml转为Document
             */
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("src/main/resources/template/.xml"));
            /**
            * 获取节点
            */
            Node node = document.selectSingleNode("/MESSAGE/DATASET/DATA/ITEM[3]");
            Element element = (Element) node;
            
             /**
             * 新增ITEM节点,并在节点中添加key和value属性
             */
            Element item = element.addElement("ITEM");
            item.addAttribute("key", "test_key")
                .addAttribute("value", "test");
             

2、在指定位置添加元素

实现原理就是将所有节点插入到list中,新建一个元素插入到已有的指定位置。

上代码:

node = document.selectSingleNode("/ROOT/NODE1");
element = (Element) node;
List<Element> list = element.elements();
Element item = DocumentHelper.createElement("CHILD");
item.addAttribute("key_test", "test")
    .addAttribute("value", "hello world");
//在第二个子元素下添加一个元素
list.add(2, item);

六、将字符串转为xml文件

             /**
             * 输出为xml文件 创建一种输出格式,每个节点元素可自动换行
             */
            OutputFormat outputStream = OutputFormat.createPrettyPrint();
            outputStream.setEncoding("UTF-8");
            XMLWriter xmlWriter =
                new XMLWriter(new FileWriter(new File("src/main/resources/template/test02.xml")), outputStream);
            xmlWriter.write(document);
            xmlWriter.close();

七、对于xml文件读取解析主流方法有以下四种:

1、dom

2、jdom

3、dom4j----最推荐使用的

4、sax

总结如下:

      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流被读入时,会有部分文档暂时隐藏在内存中)

这篇文章对于总结很到位:https://www.cnblogs.com/longqingyang/p/5577937.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值