dom4j是第三方公司封装的,dom、sax和stax是jdk提供的。
简单说下区别:dom和dom4j需要把文档都加载到内存中,所以对内存要求比较高
sax和stax不需要加载到内存中,可以实时读取XML。
所以sax和stax在解析大文件的XML时比较有效率。
若要对XML文档进行修改操作时可以选择dom4j和dom。
1. dom4j方法:
引入依赖:
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
自定义工具类:
package com.utils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.HashMap;
import java.util.Map;
/**
* 解析XML
*/
public class ParseXml {
/**
* 解析数据列表的xml
* @param xmlStr
* @return
* @throws DocumentException
*/
public static String parseSearchXml(String xmlStr) throws DocumentException {
if (xmlStr==null){
return null;
}
String result=null;
//把返回的内容解析成XML
Document document= DocumentHelper.parseText(xmlStr);
//获取根节点
Element root;
root=document.getRootElement();
//一级一级的获取子节点的内容
result=root.element("eleName1").element("eleName2").element("eleName3").getText();
return result;
}
}
2.JDK自带方法 DOM:
2.1 文件读取
xml文件内容如下:
上图中xml包含<font>标签下包含了两种元素Text元素和Node元素,Text元素包含:<font>标签和<name>标签间的空白,</name>标签和<size>标签间的空白,</size>标签和</font>标签间的空白,Node元素包含<name>和<size>标签两个。
所以若调用下面的rootElement.getChildNodes()方法的长度是5而不是2,因为包含了Text元素,所以可能需要去除此种类型的元素。
DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
Document document =documentBuilder.parse(new File("/work/xml.xml"));
//获取根元素
Element rootElement =document.getDocumentElement();
//获取该元素下的子元素
NodeList nodeList =rootElement.getChildNodes();
System.out.println(nodeList.getLength());
//NodeList的item方法获取每个Node元素
for (int i=0;i<nodeList.getLength();i++){
Node node= nodeList.item(i);
//<font>标签下包含Text和Node两种元素,去除空白元素
if (! (node instanceof Element)){
continue;
}
Element element=(Element) node;
//获取标签名
String tagName=element.getTagName();
//若确定该标签下只有一个Text元素时直接调用getFirstChild方法即可
Text text =(Text)element.getFirstChild();