Java解析XML:DOM与SAX方法详解
"这篇文章主要探讨了使用Java解析XML的四种方法,包括DOM、SAX、Pull解析器以及StAX。XML作为一种广泛使用的数据交换格式,适用于跨平台的应用场景。了解和掌握这些解析方式对于Java开发者来说至关重要。" 在Java中,处理XML数据有多种策略,以下将详细介绍四种常见的解析方法: 1. DOM(Document Object Model): DOM是一种基于树型结构的XML文档表示法。它将整个XML文档加载到内存中,创建一个对象模型,允许开发者通过节点遍历和修改文档。例如,你可以通过节点查找找到特定元素并修改其内容。然而,DOM解析器对内存和CPU的要求较高,因为需要一次性加载整个文档。以下是一个简单的DOM解析示例: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import java.io.File; public class DOMExample { public static void main(String argv[]) { try { File inputFile = new File("input.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("employee"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); // ... 进一步处理节点 } } catch (Exception e) { e.printStackTrace(); } } } ``` 2. SAX(Simple API for XML): SAX是一种事件驱动的解析器,它不创建完整的文档对象模型,而是通过事件回调函数来处理XML文档。这种方式节省了内存,但需要编写更多的代码来处理事件。SAX解析器适合处理大型XML文件。以下是一个SAX解析的简单示例: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXExample extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if ("employee".equals(qName)) { // ... 处理开始元素 } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // ... 处理字符数据 } // 其他回调方法... } // 在主程序中使用SAX解析器 public static void main(String[] args) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); saxParser.parse("input.xml", new SAXExample()); } catch (Exception e) { e.printStackTrace(); } } ``` 3. Pull解析器(Java XML Pull API): Pull解析器与SAX类似,也是事件驱动的,但提供了更简单的API,允许开发者控制解析流程。开发者可以按需读取XML数据,无需编写回调函数。以下是一个使用Pull解析器的例子: ```java import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.FileInputStream; public class PullExample { public static void main(String[] args) throws Exception { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("input.xml")); while (reader.hasNext()) { int event = reader.next(); switch (event) { case XMLStreamConstants.START_ELEMENT: if ("employee".equals(reader.getLocalName())) { // ... 处理开始元素 } break; case XMLStreamConstants.CHARACTERS: // ... 处理字符数据 break; // 其他事件... } } reader.close(); } } ``` 4. StAX(Streaming API for XML): StAX是另一种流式解析API,它允许开发者以迭代方式逐个处理XML事件。与Pull解析器类似,StAX提供了更灵活的控制权,同时减少了内存占用。以下是一个使用StAX的示例: ```java import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.FileInputStream; public class StAXExample { public static void main(String[] args) throws Exception { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("input.xml")); while (reader.hasNext()) { int event = reader.next(); switch (event) { case XMLStreamConstants.START_ELEMENT: if ("employee".equals(reader.getLocalName())) { // ... 处理开始元素 } break; case XMLStreamConstants.CHARACTERS: // ... 处理字符数据 break; // 其他事件... } } reader.close(); } } ``` 每种解析方法都有其适用场景,选择哪种取决于你的需求,如内存限制、处理速度、代码复杂度等。在实际项目中,可以根据XML文件的大小和处理需求来决定使用哪种解析策略。
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法。
AD: 51CTO云计算架构师峰会 抢票进行中!
XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具体可参阅w3c官方网站文档http://www.w3.org获取更多信息。
XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。假设我们XML的内容和结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee>
<name>ddviplinux</name>
<sex>m</sex>
<age>30</age>
</employee>
</employees>
本文使用JAVA语言来实现DOM与SAX的XML文档生成与解析。
首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的建立与解析的接口。
package com.alisoft.facepay.framework.bean;
/**
*
* @author hongliang.dinghl
* 定义XML文档建立与解析的接口
*/
public interface XmlDocument {
/**
* 建立XML文档
* @param fileName 文件全路径名称
*/
/**
* 解析XML文档
* @param fileName 文件全路径名称
*/
public void parserXml(String fileName);
}
1.DOM生成和解析XML文档
为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
package com.alisoft.facepay.framework.bean;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
剩余16页未读,继续阅读
- 粉丝: 0
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦