常见的DOM类解析器主要分为三种,DOM解析器,JDOM解析器以及DOM4J解析器。后两种主要在第一种的基础上简化演变过来的。三种之间的对比如下表格:
解析器 | 说明 | 优点 | 缺点 |
DOM | 一种支持跨平台的底层API,构建类树形数据结构,其代码包在org.w3c.dom中 | 1. 跨平台的底层API。 2. 可以修改XML文件。
| 性能较差,对于大于10M的XML文件解析较差。 |
JDOM | 针对JAVA的一款改进解析器,即简化了API以及使用了Collections类,jdom2的jar包 | 1. 简化了API并使用了大量的集合类,有利于java开发人员使用。
| 性能较差,对于大于10M的XML文件解析较差。 |
DOM4J | 是JDOM的一个分支,增加了对大文档的处理,包在dom4j的jar包中 | 1.性能较快,增加了对大文档的处理。集成了Xpath。 | 可移植性较差 |
一,DOM解析器:
1.DOM解析器的步骤可以分为如下四个步骤:
1)创建解析工厂类实例factory
2)利用factory生成一个解析器builder
3) 创建需要解析的文档Doc
4)获取根元素root并获取相关标签元素
2.实例代码如下
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
publicclassDOMParser {
publicstatic void main(String[] args)throws Exception {
//1.创建解析器工厂实例
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
//2.并生成解析器
DocumentBuilder builder =factory.newDocumentBuilder();
//3.创建需要解析的文档对象
File f = new File("src\\User.xml");
Document doc = builder.parse(f);
//4.获取文档根元素
Element root =doc.getDocumentElement();
//上面找到了根节点,这里开始获取根节点下的元素集合
NodeList list =root.getElementsByTagName("user");
for (int i = 0; i < list.getLength(); i++) {
//通过item()方法找到集合中的节点,并向下转型为Element对象
Element n = (Element) list.item(i);
//获取对象中的属性map,用for循环提取并打印
NamedNodeMap node =n.getAttributes();
for (int x = 0; x < node.getLength(); x++) {
Node nn = node.item(x);
System.out.println(nn.getNodeName()+": "+ nn.getNodeValue());
}
//打印元素内容
System.out.println("name: "+n.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
System.out.println("age: " +n.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());
}
}
}
3.测试结果为:
id: 1
name: 小红
age: 19
id: 2
name: 小明
age: 17
id: 3
name: 小黄
age: 18
二.JDOM
1.JDOM作为延伸自DOM的面向java的解析器,其步骤和DOM大同小异,主要步骤如下:
1)生成解析器builder
2)创建需要解析的文档doc
3)获取doc的根元素root
2.示例代码如下:
import java.io.IOException;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
publicclassJDOMParser {
publicvoidparserXml() throwsJDOMException, IOException{
//1.生成解析器builder
SAXBuilderbuilder = newSAXBuilder();
//2.创建需要解析的文档doc
Documentdoc=builder.build("src\\User.xml");
//3.获取doc的根元素root
ElementeleUsers=doc.getRootElement();
//根据User标签获取所有的子节点元素
ListuserList=eleUsers.getChildren("user");
for(inti=0;i<userList.size();i++){
Elementuser=(Element) userList.get(i);
System.out.println(user.getName());
ListuserAttribute=user.getChildren();
for(intj=0;j<userAttribute.size();j++)
{
System.out.println(((Element)userAttribute.get(j)).getName()+((Element)userAttribute.get(j)).getValue());
}
}
}
publicstaticvoidmain(String args[])throws JDOMException, IOException{
new JDOMParser().parserXml();
}
}
3.测试如下:
user
name小红
age19
user
name小明
age17
user
name小黄
age18
三.DOM4J
1.作为DOMJ的一个智能分支,可以看到DOM4J的解析步骤和DOMJ没有什么区别,其步骤如下:
1)生成解析器SAX
2)解析生成文档doc
3)获取doc的根元素root
2.其主要实例代码如下:
public Element getRootelement()throws DocumentException{
//1.生成解析器SAX
SAXReadersaxRe=newSAXReader();
//2.解析生成文档doc
Documentdoc=saxRe.read(newFile("src/TestParser.xml"));
//3.获取doc的根元素root
Elementroot=doc.getRootElement();
return root;
}
总结:三个DOM类的解析器使用步骤都大同小异,无非就是获取解析器,然后把要解析的XML文档转换为Document类文档,然后最终得到我们需要的根元素Root,随后对根元素的子元素进行遍历。JDOM 和 DOM 在性能上面表现的并不好,文档大于10M的时候会出现内存溢出的情况。而DOM4J是最好的,目前许多开源项目中大量采用DOM4J,如果不考虑可移植性,那就采用DOM4J吧!