Java中有两种解析XML文件的方式:DOM解析和SAX解析。

一、使用DOM4j进行XML的DOM解析

DOM解析是一次性将整个XML文档加载进内存,在内存中构建Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到XML文档的内容。

通常使用Dom4j工具进行XML的DOM解析,首先要到Dom4j的官网https://dom4j.github.io/下载包并加载到IDE开发工具中(例如eclipse)。

1.1、使用DOM4j查询XML文档

XML文档在DOM解析中可以被映射为多种节点,其中比较重要和常见的是元素节点(Element)、属性节点(Attribute)和文本节点(Text)。

查询节点主要可以使用以下方法:

  • Document new SAXReader().read(File file) —— 读取XML文档
  • Element Document.getRootElement() —— 获取XML文档的根元素节点
  • Iterator Element.nodeIterator() —— 获取当前元素节点下的所有子节点
  • Iterator<Element> Element.elementIterator(元素名) —— 指定名称的所有子元素节点
  • Iterator<Attribute> Element.attributeIterator() —— 获取所有子属性节点
  • List<Element> Element.elements() —— 获取所有子元素节点
  • List<Attribute> Element.attributes() —— 获取所有子属性字节
  • Element Element.element(元素名) —— 指定名称的第一个子元素节点
  • Attribute Element.attribute(属性名) —— 获取指定名称的子属性节点
  • String Element.attributeValue(属性名) —— 获取指定名称的子属性的属性值
  • String Attribute.getName() —— 获取属性名称
  • String Attribute.getValue() —— 获取属性值
  • String Element.getText() —— 获取当前元素节点的子文本节点
  • String Element.elementText(元素名) —— 获取当前元素节点的指定名称的子文本节点

示例:在eclipse中读取以下students.xml文档的内容,并打印至控制台

<?xml version="1.0" encoding="UTF-8"?><Students><Student id="001"><name>张三</name><age>19</age><gender>男</gender><grade>计算机1班</grade></Student><Student id="002"><name>李四</name><age>20</age><gender>男</gender><grade>计算机2班</grade></Student>
</Students>

import java.io.File;
import java.util.List;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;public class ReadAndPrintXML {public static void main(String[] args) throws Exception {// 创建一个XML解析器对象SAXReader reader = new SAXReader();// 读取XML文档,返回Document对象Document document = reader.read(new File("E:xmlstudents.xml"));// 获取根元素节点Element root = document.getRootElement();StringBuilder sb = new StringBuilder();recursion(root, sb);System.out.println(sb.toString());}private static void recursion(Element ele, StringBuilder sb) {sb.append("<");// 解析元素节点sb.append(ele.getName());// 解析属性节点List<Attribute> attributes = ele.attributes();for(Attribute attribute : attributes) {sb.append(" ");sb.append(attribute.getName());sb.append("=");sb.append(attribute.getValue());}sb.append(">");// 解析文本节点sb.append(ele.getText());// 递归解析元素节点List<Element> elements = ele.elements();for(Element element : elements) {recursion(element, sb);}sb.append("<" + ele.getName() + "/>n");}}

1.2、使用DOM4j修改XML文档

①写出内容到xml文档

XMLWriter writer = new XMLWriter(OutputStream out, OutputFormat format)

writer.write(Document doc)

上面的OutputFormat对象可以由OutputFormat类的两个静态方法来生成:

  • createPrettyPrint() —— 生成的OutputFormat对象,使写出的XML文档整齐排列,适合开发环境使用
  • createCompactFormat() —— 生成的OutputFormat对象,使写出的XML文档紧凑排列,适合生产环境使用

②生成文档或增加节点

  • Document DocumentHelper.createDocument() —— 生成一个新的XMLDocument对象
  • Element Element.addElement(元素节点名) —— 增加一个子元素节点
  • Attribute Element.addAttribute(属性名,属性值) —— 增加一个子属性节点

③修改节点

  • Attribute.setValue(属性值) —— 修改属性节点值
  • Attribute Element.addAttribute(同名属性名,属性值) —— 修改同名的属性节点值
  • Element.setText(内容) —— 修改文本节点内容

④删除节点

  • Element.detach() —— 删除元素节点
  • Attribute.detach() —— 删除属性节点

示例:生成一个和前面的students.xml一样的XML文档,并写入到磁盘

import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;public class WriteXML {public static void main(String[] args) throws Exception {// 创建一个XMLWriter对象OutputFormat format = OutputFormat.createPrettyPrint();XMLWriter writer = new XMLWriter(new FileOutputStream("E:xmlstudents2.xml"), format);// 生成一个新的Document对象Document doc = DocumentHelper.createDocument();// 增加Students元素节点Element students = doc.addElement("Students");// 增加两个Student元素节点Element student1 = students.addElement("student");Element student2 = students.addElement("student");// 为两个Student元素节点分别增加id属性节点student1.addAttribute("id", "001");student2.addAttribute("id", "002");// 分别增加name, age, gender, grade元素子节点student1.addElement("name").setText("张三");student1.addElement("age").setText("19");student1.addElement("gender").setText("男");student1.addElement("grade").setText("计算机1班");student2.addElement("name").setText("李四");student2.addElement("age").setText("20");student2.addElement("gender").setText("男");student2.addElement("grade").setText("计算机2班");// 将Document对象写入磁盘writer.write(doc);writer.close();}
}

1.3、使用xPath技术

使用dom4j查询比较深的层次结构的节点时,比较麻烦,因此可以使用xPath技术快速获取所需的节点对象。

首先也需要在eclipse中导入xPath的jar包,我这里使用的是jaxen-1.1-beta-6.jar

①使用xPath的方法

  • List<Node> Document.selectNodes(xpath表达式) —— 查询多个节点对象
  • Node Document.selectSingleNode(xpath表达式) —— 查询一个节点对象

②xPath表达式语法

  • / —— 绝对路径,表示从xml文档的根位置开始
  • // —— 相对路径,表示不分任何层次结构的选择元素
  • * —— 表示匹配所有元素
  • [] —— 条件,表示选择符合条件的元素
  • @ —— 属性,表示选择属性节点
  • and —— 关系,表示条件的与关系
  • text() —— 文本,表示选择文本内容

示例:

import java.io.File;
import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;public class XPathTest {public static void main(String[] args) throws Exception {SAXReader reader = new SAXReader();Document doc = reader.read(new File("E:xmlstudents.xml"));// 选择所有的student元素List<Node> list = doc.selectNodes("//Student");// 选择文本内容是"张三"的name元素Element name = (Element) doc.selectSingleNode("//name[text()='张三']");// 选择所有id属性节点List<Node> list2 = doc.selectNodes("//@id");// 选择id属性为002的student元素Element student = (Element) doc.selectSingleNode("//Student[@id='002']");// 选择根元素节点的所有子节点Element root = doc.getRootElement();List<Node> list3 = doc.selectNodes("/Students/*");}
}

二、使用SAX方式解析XML文档

SAX方式解析的原理是:在内存中加载一点,读取一点,处理一点。对内存要求比较低。

JDK内置了SAX解析工具,存放在org.xml.sax包中。

2.1、使用SAX解析方式查询XML文档

核心的API类:

1、SAXParser.parse(File f, DefaultHandler dh)方法:解析XML文件

参数一File:表示读取的XMl文件

参数二DefaultHandler:SAX事件处理程序,包含SAX解析的主要逻辑。开发人员需要写一个DefaultHandler的子类,然后将其对象作为参数传入parse()方法。

2、 SAXParserFactory类,用于创建SAXParser对象,创建方式如下:

SAXParser parse = SAXParserFactory.newInstance().newSAXParser();

3、DefaultHandler类的主要方法:

  • void startDocument() —— 在读到文档开始时调用
  • void endDocument() —— 在读到文档结束时调用
  • void startElement(String uri, String localName, String qName, Attributes attributes) —— 读到开始标签时调用
  • void endElement(String uri, String localName, String qName) —— 读到结束标签时调用
  • characters(char[] ch, int start int length) —— 读到文本内容时调用

示例:使用SAX解析方式读取上面students.xml的内容,并打印至控制台。

import java.io.File;import javax.xml.parsers.ParserConfigurationException;
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;public class SAXTest {public static void main(String[] args) throws Exception {SAXParser parser = SAXParserFactory.newInstance().newSAXParser();parser.parse(new File("E:xmlstudents.xml"), new MyDefaultHandler());}
}class MyDefaultHandler extends DefaultHandler{@Overridepublic void startDocument() throws SAXException {System.out.println("----文档开始解析-------");}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {System.out.print("<" + qName);for(int i = 0; i < attributes.getLength(); i++) {System.out.print(" " + attributes.getQName(i) + "=" + attributes.getValue(i));}System.out.print(">");}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {System.out.print(new String(ch, start, length));}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {System.out.print("</" + qName + ">");}@Overridepublic void endDocument() throws SAXException {System.out.println("n----文档开始解析结束-----");}
}

2.2、对比DOM解析和SAX解析

生成xml_Java操作XML相关推荐

  1. 在C#.net中如何操作XML

    在C#.net中如何操作XML 需要添加的命名空间: using System.Xml; 定义几个公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEle ...

  2. ActionScript 3操作XML 详解

    AS3引入了E4X ,它是根据ECMAScript标准处理XML 数据的全新机制.这使得程序员在程序中无缝地操作XML.在AS3中可以使用XML字面值将XML数据直接写入代码,该字面值将被自动解析. ...

  3. c#操作xml实例 2009-03-13 20:00

    在C#.net中如何操作XML 需要添加的命名空间: using System.Xml; 定义几个公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEle ...

  4. 利用opencv中的类FileStorage生成和读取XML和YAML文件

    有时候程序中的变量值.字符串.数组等数据也需要独立于源代码本身保存,这个时候就需要用到XML和YAML文件进行保存. OpenCV4提供了用于生成和读取XML文件和YAML文件的类FileStorag ...

  5. Eclipse 用Hibernate Tools 生成 .hbm cfg.xml等文件

    建立好数据库后,点击一个键,代码就生成了,这实在是份十分惬意的事情,前面有介绍Hibernate Tools就可以生成代码,那么我们怎么利用它来生成代码呢. 下面就把详细步骤贴出来,同样,有图有真相. ...

  6. python 中使用ElementTree操作XML

    概述 对比其他 Python 处理 XML 的方案,xml.etree.ElementTree 模块(下文我们以 ET 来表示)相对来说比较简单,接口也较友好. 官方文档 里面对 ET 模块进行了较为 ...

  7. python批量生成,用python批量生成简单的xml文档

    最近生成训练数据时,给一批无效的背景图片生成对应的xml文档,我用python写了一个简单的批量生成xml文档的demo,遇见了意外的小问题,记录一下. 报错问题为:ImportError: No m ...

  8. VC操作XML编程实例

    XML编程实例 文章正文 前段时间,由于工作的需要,利用到了XML,所以对其进行了一些简单的研究.在此愿把一些心得写出来,与各位分享,不对的地方还望多多包涵. 1.什么是 XML? 首先,我想各位应该 ...

  9. 写了一个操作XML文件的类

    一个操作XML文件的类..部份功能在完善中~~~~ using System; using System.Collections.Generic; using System.Text; using S ...

最新文章

  1. 漫画:据说很多搞软件的羡慕硬件工程师
  2. Error running query: MetaException(message:Got exception: java.net.ConnectException Call From XXXX
  3. Oracle 自己主动诊断资料档案库 (ADR)、自己主动诊断工作流、ADRCI工具
  4. 机器学习(十六)——隐式狄利克雷划分
  5. 果汁飞溅海报还不会玩?先从临摹学习PSD分层模板开始
  6. Nginx学习总结(14)——Nginx配置参数详细说明与整理
  7. jmap查询JVM堆内存
  8. 万字长文!用文本挖掘深度剖析54万首诗歌
  9. 应用wps对证件照进行更改颜色,更换只需三步。
  10. Win11怎么进行屏幕休眠时间的设置
  11. 正则表达式 /^[0-9]+$/
  12. Redis的复制(Master/Slaver)
  13. java 循环详解_Java for循环详解
  14. Ubuntu20.04突然丢失网络时恢复的办法
  15. 怎样将PDF转成EXCEL
  16. 虚幻4引擎源码学习笔记(一):整体文件结构
  17. 向上累积频数怎么算_累计频数怎么求(怎样计算频数和频率)
  18. 单片机入门学习笔记6:新唐单片机N76E003
  19. 应用机器学习 Applied Machine Learning (AML) ppt2
  20. vue 网格组件_简单的Vue组件可显示带有事件的月网格日历

热门文章

  1. request.form()和request()和request.data的区别
  2. Linux编写一个C程序HelloWorld
  3. 转载非原创:修改BB 的内容,回车后修改CC 的值
  4. Android保存图片到数据库,从数据库取图片的方法
  5. oracle查询正在执行的语句和kill session
  6. 《Go语言从入门到实战》学习笔记(1)——Go语言学习路线图、简介
  7. 想要彻底搞懂“异地多活”,看完这篇就够了
  8. 一文读懂RocketMQ的存储机制
  9. 编程高手是如何练成的?
  10. 高频面试题:秒杀场景设计