概述
XML文档是我们平时项目中最常用的配置方式。虽然现在springBoot提倡简化配置,去掉了众多繁杂的XML等配置。但在很多其他地方,如自定义的配置和信息设置,还是会使用到XML。
这里,就来介绍以下XML文档的四种解析方式:
- Dom
- SAX
- JDOM
- dom4j
1、【dom】
DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
以下是个简单的使用例子:(主要通过创建Document
,将xml转换为Document
来进行读取解析)
//1.获取DOM 解析器的工厂实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2.获得具体的DOM解析器。
DocumentBuilder builder = factory.newDocumentBuilder();
//3.获取文件
Document document = builder.parse(new File("testXML.xml"));
//4.获取根元素
Element root = document.getDocumentElement();
System.out.println("name="+root.getAttribute("name"));
//5.获取根节点[有多个节点]
NodeList list = root.getElementsByTagName("par");
for (int i = 0; i < list.getLength(); i++) {
System.out.println("---------------");
Element par = (Element) list.item(i);
System.out.println("id=" + par .getAttribute("id"));
//获取子节点集合
NodeList clist = par .getChildNodes();
for (int j = 0; j < clist.getLength(); j++) {
//获取下标
Node c = clist.item(j);
//把空格删除[获取属性名和值]
if (c instanceof Element) {
System.out.println(c.getNodeName()+"="+c.getTextContent());
}
}
}
2、【dom4j】
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的,dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
以下是个简单的使用例子:
/** 创建:
1. 设置根节点: DocumentHelper.createElement("根节点名");
2. 读取doucment元素:DocumentHelper.createDocument(root);
3. 添加根节点:addAttribute("name", "value");
4. 添加字节点、赋值:addElement("name"); setText("value");
5. 添加到根节点:XMLWriter xmlWriter = new XMLWriter(); xmlWriter.write(document);
**/
// 创建文档并设置文档的根元素节点
Element root = DocumentHelper.createElement("books");
Document doucment = DocumentHelper.createDocument(root);
//根节点
root.addAttribute("name","bookvalue");
//子节点
Element element1 = root.addElement("author1 ");
element1.addAttribute( "name", "TOM" );
element1.addAttribute( "location", "CHN" );
element1.addText( "TOM MARK" );
Element element = root.addElement("author2 ");
element.addAttribute( "name", "JAMS" );
element.addAttribute( "location", "USA" );
element.addText( "JAMS TONY" );
//添加
XMLWriter xmlwriter2 = new XMLWriter();
xmlwriter2.write(doucment);
//创建文件 (这里代码有问题)
OutputFormat format = new OutputFormat();
FileOutputStream file = new FileOutputStream("books.xml");
XMLWriter xml = new XMLWriter(file);
xml.close();
/** 读取:
1.获取SAM接口:SAXReader saxReader = new SAXReader();
2.获取XML文档: Document doc = saxReader.read(new File("name.xml"));
3.获取根节点:Element root = doc.getRootElement();
4.获取子节点:root.elementIterator();
5.获取孙节点: attributeIterator();
**/
//1.获取SAM接口:
SAXReader saxReader = new SAXReader();
//2.获取XML文件:
Document doc = saxReader.read(new File("newxml.xml"));
//3.获取根节点:
Element root = doc.getRootElement();
System.out.println("根节点: " + root.getName());
System.out.println("----------------");
//获取子节点
Iterator<?> it = root.elementIterator();
while(it.hasNext()){
Element elem = (Element) it.next();
//获取属性名属性值
List<Attribute> li = elem.attributes();
for (Attribute att : li ) {
System.out.println(att.getName() + " " + att.getValue() );
}
//获取子节的子节点
Iterator<?> ite = elem.elementIterator();
while(ite.hasNext()){
Element child = (Element) ite.next();
System.out.println(child.getName() + " " + child.getStringValue());
}
System.out.println("----------------");
}
3、【JDOM】
JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAX和DOM的功能有效地结合起来。JDOM是用Java语言读、写、操作XML的新API函数。在直接、简单和高效的前提下,这些API函数被最大限度的优化。
以下是个简单的使用例子:
//读取:==========================================================================
//1.创建一个SAXBuilder的对象
SAXBuilder saxBuilder = new SAXBuilder();
//2.创建一个输入流,将xml文件加载到输入流中
InputStream in = new FileInputStream("Book.xml");
InputStreamReader isr = new InputStreamReader(in, "UTF-8");
//3.通过saxBuilder的build方法,将输入流加载到saxBuilder中
Document document = saxBuilder.build(isr);
//4.通过document对象获取xml文件的根节点
Element rootElement = document.getRootElement();
//5.获取根节点下的子节点的List集合
List<Element> elementList = rootElement.getChildren();
for (Element element : elementList) {
// 解析文件的属性集合
List<Attribute> list = element.getAttributes();
for (Attribute attr : list) {
// 获取属性名
String attrName = attr.getName();
// 获取属性值
String attrValue = attr.getValue();
System.out.println(attrName +"="+ attrValue);
// 对book节点的子节点的节点名以及节点值的遍历
List<Element> listChild = element.getChildren();
for (Element child : listChild) {
System.out.println(child.getName() +"="+child.getValue());
}
}
}
//创建:==========================================================================
//1.生成一个根节点
Element root = new Element("TestXML");
//2.为节点添加属性
root.setAttribute("Par","ONE");
//3.生成一个document对象
Document document = new Document(root);
//添加元素
Element first= new Element("First");
first.setAttribute("id","1");
Element name = new Element("name");
name.setText("Ont");
first.addContent(name);
Element second= new Element("Second");
second.setText("Two");
first.addContent(second);
root.addContent(first);
//添加元素
Element third= new Element("Third");
third.setAttribute("id","1");
Element name2 = new Element("name");
name2.setText("three");
third.addContent(name2);
Element fourth = new Element("Fourth");
fourth.setText("four");
third.addContent(fourth );
root.addContent(third);
//格式 换行、编码
Format format = Format.getCompactFormat();
format.setIndent("");
format.setEncoding("GBK");
//4.创建XMLOutputter的对象
XMLOutputter outputer = new XMLOutputter(format);
try {
//5.利用outputer将document对象转换成xml文档
outputer.output(document, new FileOutputStream(new File("Booknews.xml")));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
4、【SAX】
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。