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());}}}}
}
运行:

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 文档时调用*/@Overridepublic void startDocument() throws SAXException {System.out.println("BookHandler.startDocument()");}/*解析 xml 文档结束时调用*/@Overridepublic void endDocument() throws SAXException {System.out.println("==========解析文档结束==========");}/*开始解析文档中节点时调用*/@Overridepublic 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);}}}/*解析文档中节点结束时调用*/@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {System.out.println("解析元素-->" + qName + "结束" );}@Overridepublic 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);}
}
运行:

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() + "\t");}System.out.println();}}
}
运行:

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("\t" + 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());}}}
}
运行:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
