Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J

Java 四种解析 XML 的特点

1、DOM 解析:
形成了树结构,有助于更好的理解、掌握,且代码容易编写。
解析过程中,树结构保存在内存中,方便修改。

2、SAX 解析:
采用事件驱动模式,对内存耗费比较小。
适用于只处理 XML 文件中的数据时

3、JDOM 解析:
仅使用具体类,而不使用接口。
API 大量使用了 Collections 类。

4、DOM4J 解析:
JDOM 的一种智能分支,它合并了许多超出基本 XML 文档 表示的功能。
它使用接口和抽象基本类方法。 具有性能优异、灵活性好、功能强大和极端易用的特点。
是一个开放源码的文件

代码:
先准备一个book.xml文件放到src目录下:

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book id="1001">
		<name>三国演义</name>
		<author>罗贯中</author>
		<price>98.5</price>
	</book>
	<book id="1002">
		<name>水浒传</name>
		<author>施耐庵</author>
		<price>89.7</price>
	</book>
	<book id="1003">
		<name>西游记</name>
		<author>吴承恩</author>
		<price>99.9</price>
	</book>
	<book id="1004">
		<name>红楼梦</name>
		<author>曹雪芹</author>
		<price>77.7</price>
	</book>
</books>

1、DOM 解析:

package com.xzlf.xml;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * DOM 解析 XML
 * @author xzlf
 *
 */
public class DOMParseTest {
	public static void main(String[] args) throws Exception {
		// 1、创建 DocumentBuilderFactory 工厂对象
		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		// 2、通过工厂对象创建 DocumentBuilder 对象
		DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
		// 3、通过 DocumentBuilder 的 parse (...) 方法得到Document对象
		Document doc = docBuilder.parse("src/book.xml");
		
		// 4、获取节点列表
		NodeList bookList = doc.getElementsByTagName("book");
		System.out.println(bookList.getLength());
		// 遍历节点属性
		for (int i = 0; i < bookList.getLength(); i++) {
			// 获取每个节点的属性和值
			Node item = bookList.item(i);
			// 获取属性集合
			NamedNodeMap attributes = item.getAttributes();
			// 遍历属性集合
			for (int j = 0; j < attributes.getLength(); j++) {
				Node id = attributes.item(j);
				System.out.println(id.getNodeName() + "--" + id.getNodeValue());
			}
		}
		// 遍历子节点
		System.out.println("====================");
		for (int i = 0; i < bookList.getLength(); i++) {
			Node item = bookList.item(i);
			NodeList childNodes = item.getChildNodes();
			for (int j = 0; j < childNodes.getLength(); j++) {
				Node child = childNodes.item(j);
				if(child.getNodeType() == Node.ELEMENT_NODE) {
					System.out.println(child.getNodeName() + "--" + child.getTextContent());
				}
				
			}
			
		}
	}
}

运行:
Java 解析 xml 常见的4中方式:DOM  SAX JDOM DOM4J
2、SAX 解析:

package com.xzlf.xml;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *  Sax 解析 xml
 * @author xzlf
 *
 */
public class SAXParseTest {
	public static void main(String[] args) throws Exception {
		// 1、创建 SAXParserFactory 的对象 
		SAXParserFactory saxFactory = SAXParserFactory.newInstance();
		// 2、创建 SAXParser 对象 (解析器) 
		SAXParser parser = saxFactory.newSAXParser();
		// 3、创建一个 DefaultHandler 的子类 
		BookHandler handler = new BookHandler();
		// 4、调用 parse 方法 
		parser.parse("src/book.xml", handler);
	}
}

class BookHandler extends DefaultHandler{
	/*开始解析 xml 文档时调用*/
	@Override
	public void startDocument() throws SAXException {
		System.out.println("BookHandler.startDocument()");
	}
	
	/*解析 xml 文档结束时调用*/
	@Override
	public void endDocument() throws SAXException {
		System.out.println("==========解析文档结束==========");
	}
	
	/*开始解析文档中节点时调用*/
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.print("开始解析元素-->" + qName );
		if("book".equals(qName)) {
			System.out.println(attributes.getLength());
			for (int i = 0; i < attributes.getLength(); i++) {
				String attName = attributes.getQName(i);//属性名称
				String attValue = attributes.getValue(i);//属性值
				System.out.println("属性名称:" + attName + "属性值:" + attValue);
			}
		}
	}
	
	/*解析文档中节点结束时调用*/
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		System.out.println("解析元素-->" + qName + "结束" );
	}
	
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		String values = new String(ch, start, length);
		if(!"".equals(values.trim()))
		System.out.println(values);
	}
}

运行:
Java 解析 xml 常见的4中方式:DOM  SAX JDOM DOM4J
3、JDOM 解析:

package com.xzlf.xml;

import java.io.File;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

/**
 * JDOM 解析 xml
 * 需要导包:http://www.jdom.org/downloads/index.html
 * @author xzlf
 *
 */
public class JDOMParseTest {
	public static void main(String[] args) throws Exception{
		// 1、创建一个 SAXBuilder 对象 
		SAXBuilder sb = new SAXBuilder();
		// 2、调用 build 方法,得到 Document 对象(通过 IO 流)
		Document doc = sb.build(new File("src/book.xml"));
		// 3、获取根节点 
		Element rootEle = doc.getRootElement();//books
		// 4、获取根节点的直接子节点的集合 
		List<Element> children = rootEle.getChildren();
		// 5、遍历集合 
		for (int i = 0; i < children.size(); i++) {
			Element ele =  children.get(i);
			// 得到属性集合
			List<Attribute> attributes = ele.getAttributes();
			// 遍历属性的集合得到每一个属性
			for (Attribute attr : attributes) {
				System.out.println(attr.getName() + "-->" + attr.getValue());
			}
		}
		// 获取每一个子节点
		System.out.println("===========子节点==============");
		for (int i = 0; i < children.size(); i++) {
			Element book = children.get(i);
			List<Element> ele = book.getChildren();
			for (Element e : ele) {
				System.out.print(e.getName() + "-->" + e.getValue() + "	");
			}
			System.out.println();
		}
		
	}
}

运行:
Java 解析 xml 常见的4中方式:DOM  SAX JDOM DOM4J
4、DOM4J 解析:

package com.xzlf.xml;

import java.io.File;
import java.util.Iterator;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * DOM4J 解析 XML
 * 需要导包:https://dom4j.github.io/#looping
 * @author xzlf
 *
 */
public class DOM4JParseTest {
	public static void main(String[] args) throws DocumentException {
		// 1、创建 SAXReader 对象 
		SAXReader reader = new SAXReader();
		// 2、调用 read 方法 
		Document doc = reader.read(new File("src/book.xml"));
		// 3、获取根元素 
		Element root = doc.getRootElement();//books
		// 4、通过迭代器遍历直接节点 
		for(Iterator<Element> iterator = root.elementIterator(); iterator.hasNext();) {
			Element book = iterator.next();
			System.out.println(book.getName());
			//得到book的属性
			for (Iterator<Attribute> iter = book.attributeIterator(); iter.hasNext();) {
				Attribute attr = iter.next();
				System.out.println("	" + attr.getName() + "-->" + attr.getValue());
			}
		}
		// 遍历每一个 book 元素
		for (Iterator<Element> iterator = root.elementIterator(); iterator.hasNext();) {
			Element book = iterator.next();
			//得到每一个子元素
			for (Iterator<Element> iter = book.elementIterator(); iter.hasNext();) {
				Element ele = iter.next();
				System.out.println(ele.getName() + "-->" + ele.getText());
			}
		}
		 
	}
}

运行:
Java 解析 xml 常见的4中方式:DOM  SAX JDOM DOM4J