一、解析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