在 Java 程序中读取 XML 文件的过程称为解析 XML

解析 XML 文件的方式

1) DOM 解析 (java 官方提供)

2) SAX 解析(java 官方提供)

3) JDOM 解析(第三方提供)

4) DOM4J 解析(第三方提供)

DOM 解析 XML 的步骤

1) 创建一个 DocumentBuilderFactory 的对象       Document文档  Factory工厂

2) 创建一个 DocumentBuilder 对象

3) 通过DocumentBuilder的parse(...)方法得到Document对象

4) 通过 getElementsByTagName(...)方法获取到节点的列表

5) 通过 for 循环遍历每一个节点

6) 得到每个节点的属性和属性值

7) 得到每个节点的节点名和节点值

 import java.io.IOException;

 import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; public class TestDOMParse {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// 1) 创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
// 2) 创建一个DocumentBuilder对象
DocumentBuilder db=dbf.newDocumentBuilder();
// 3) 通过DocumentBuilder的parse(...)方法得到Document对象
Document doc=db.parse("book.xml");
// 4) 通过getElementsByTagName(...)方法获取到节点的列表
NodeList bookList=doc.getElementsByTagName("book");//有2个book节点
//System.out.println(bookList.getLength());
// 5) 通过for循环遍历每一个节点
for(int i=0;i<bookList.getLength();i++){
//6) 得到每个节点的属性和属性值
Node book=bookList.item(i);
NamedNodeMap attrs=book.getAttributes(); //得到了属性的集合
//循环遍历每一个属性
for(int j=0;j<attrs.getLength();j++){
//得到每一个属性
Node id=attrs.item(j);
System.out.println("属性的名称:"+id.getNodeName()+"\t"+id.getNodeValue());
}
}
System.out.println("\n每个节点的名和节点的值");
// 7) 得到每个节点的节点名和节点值
for(int i=0;i<bookList.getLength();i++){
//得到每一个book节点
Node book=bookList.item(i);
NodeList subNode=book.getChildNodes();
System.out.println("子节点的个数:"+subNode.getLength());
//使用for循环遍历每一book的子节点
for(int j=0;j<subNode.getLength();j++){
Node childNode=subNode.item(j);
//System.out.println(childNode.getNodeName());
short type=childNode.getNodeType(); //获取节点的类型
if(type==Node.ELEMENT_NODE){
System.out.println("节点的名称:"+childNode.getNodeName()+"\t"+childNode.getTextContent());
} }
} }
}

------------------------------------------------------------------------------------------------------------------------------------------------------

SAX 方式解析 XML 数据

SAX 的概述

SAX,全称 Simple API for XML,是一种以事件驱动的XMl API,SAX 与 DOM 不同的是它边扫描边解析,自顶向下依次解析,由于边扫描边解析,

所以它解析 XML 具有速度快,占用内存少的优点

SAX 解析 XML 的步骤

1) 创建 SAXParserFactory 的对象
2) 创建 SAXParser 对象 (解析器)
3) 创建一个 DefaultHandler 的子类
4) 调用 parse 方法

 import java.io.IOException;

 import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class TestSAXParse {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//1) 创建SAXParserFactory的对象
SAXParserFactory spf=SAXParserFactory.newInstance();
//2) 创建SAXParser对象 (解析器)
SAXParser parser=spf.newSAXParser();
//3) 创建一个DefaultHandler的子类
BookDeaultHandler bdh=new BookDeaultHandler();
//4) 调用parse方法
parser.parse("book.xml", bdh);
}
}

DefaultHandler的子类

 import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class BookDeaultHandler extends DefaultHandler {
//重写第一个方法
/**解析xml文档开始时调用*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("解析xml文档开始");
}
/*解析xml文档结束时调用*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("解析xml文档结束");
}
/**解析xml文档中的节点时调用*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
//System.out.println("解析xml文档中的节点时调用");
/**判断,如果是book节点,获取节点的属性和属性值*/
if("book".equals(qName)){
//获取所有的属性
int count=attributes.getLength();//属性的个数
//循环获取每个属性
for(int i=0;i<count;i++){
String attName=attributes.getQName(i);//属性名称
String attValue=attributes.getValue(i);//属性值
System.out.println("属性名称:"+attName+"\t属性值为:"+attValue);
}
}else if(!"books".equals(qName)&&!"book".equals(qName)){
System.out.print("节点的名称:"+qName+"\t");
} }
/**解析xml文档中的节点结束调用*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
//System.out.println("解析xml文档中的节点结束调用");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
String value=new String(ch,start,length);
if(!"".equals(value.trim())){
System.out.println(value);
} }
}

---------------------------------------------------------------------------------------------------------------------------------------

JDOM 解析 XML 数据

JDOM 概述

JDOM 是一种解析 XML 的 Java 工具包,它基于树型结构,利用纯Java的技术对XML文档实现解析。所以中适合于Java语言

导入jar包

选中复制

粘贴到lib,之后选中Jdom右键构建路径,添加至构建路径

JDOM 解析 XML 的步骤

1) 创建一个 SAXBuilder 对象

2) 调用 build 方法,得到 Document 对象(通过 IO 流)

3) 获取根节点

4) 获取根节点的直接子节点的集合

5) 遍历集合

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List; import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder; public class TestJDOM {
public static void main(String[] args) throws FileNotFoundException, JDOMException, IOException {
// 1) 创建一个SAXBuilder对象
SAXBuilder sb=new SAXBuilder();
// 2) 调用build方法,得到Document对象(通过IO流)
Document doc=sb.build(new FileInputStream("book.xml"));
// 3) 获取根节点
Element root=doc.getRootElement(); //books元素
// 4) 获取根节点的直接子节点的集合
List<Element> bookEle=root.getChildren();//book,2个book
// 5) 遍历集合,得到book的每一个子节点(子元素)
for(int i=0;i<bookEle.size();i++){
Element book=bookEle.get(i);
//得到属性集合
List<Attribute> attList=book.getAttributes();
//遍历属性的集合得到每一个属性
for (Attribute attr : attList) {
System.out.println(attr.getName()+"\t"+attr.getValue());
}
} //得到每一个子节点
System.out.println("\n-----------------------");
for(int i=0;i<bookEle.size();i++){
Element book=bookEle.get(i);//得到每一个book节点
List<Element> subBook=book.getChildren();
//遍历每一个节点,获取节点名称节点值
for (Element ele : subBook) {
System.out.println(ele.getName()+"\t"+ele.getValue());
}
System.out.println("=========================================");
} }
}

------------------------------------------------------------------------------------------------------------------------------------------------------------

DOM4J 方式解析 XML 数据

DOM4J 是一个 Java 的 XML API,是 JDOM 的升级品,用来读写 XML 文件的

DOM4J 解析 XML 的步骤

1) 创建 SAXReader 对象

2) 调用 read 方法

3) 获取根元素

4) 通过迭代器遍历直接节点

 import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
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; import com.bjsxt.entity.Book; public class TestDOM4J {
public static void main(String[] args) throws DocumentException {
// 1) 创建SAXReader对象
SAXReader reader=new SAXReader();
// 2) 调用read方法
Document doc=reader.read(new File("book.xml"));
// 3) 获取根元素
Element root=doc.getRootElement();//books
// 4) 通过迭代器遍历直接节点
for(Iterator<Element> iteBook=root.elementIterator();iteBook.hasNext();){
Element bookEle=iteBook.next();
//System.out.println(bookEle.getName());
//得到book的属性
for(Iterator<Attribute> iteAtt=bookEle.attributeIterator();iteAtt.hasNext();){
Attribute att=iteAtt.next();
System.out.println(att.getName()+"\t"+att.getText());
}
} System.out.println("\n------------------------------------");
List<Book> bookList=new ArrayList<Book>();
for(Iterator<Element> iteBook=root.elementIterator();iteBook.hasNext();){
//创建Book对象
Book book=new Book();
Element bookEle=iteBook.next();//得到每一个book
//使用for循环继续遍历
for(Iterator<Element> subBookEle=bookEle.elementIterator();subBookEle.hasNext();){
//得到每一个子元素
Element subEle=subBookEle.next();
System.out.println(subEle.getName()+"\t"+subEle.getText());
/**
* 封装成Book对象
* */
//获取节点的名称
String nodeName=subEle.getName();//name,author,price
//使用switch判断
switch (nodeName) {
case "name":
book.setName(subEle.getText());
break;
case "author":
book.setAuthor(subEle.getText());
break;
case "price":
book.setPrice(Double.parseDouble(subEle.getText()));
break;
} }
//添加到集合中
bookList.add(book);
} //遍历集合
System.out.println("\n遍历集合-----------------------\n");
for (Book b : bookList) {
System.out.println(b.getName()+"\t"+b.getAuthor()+"\t"+b.getPrice());
}
}
}
 public class Book {
//私有属性
private String name;
private String author;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Book(String name, String author, double price) {
super();
this.name = name;
this.author = author;
this.price = price;
}
public Book() {
super();
} }

四种解析 XML 的特点

1)DOM 解析:

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

2)SAX 解析:

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

3)JDOM 解析:

仅使用具体类,而不使用接口。API 大量使用了 Collections 类。

4)DOM4J 解析:

JDOM 的一种智能分支,它合并了许多超出基本 XML 文档表示的功能。

它使用接口和抽象基本类方法。

具有性能优异、灵活性好、功能强大和极端易用的特点。

是一个开放源码的文件

解析XML数据的更多相关文章

  1. iOS解析XML数据

    iOS中解析XML数据的类是  NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSX ...

  2. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  3. 160928、JQuery解析XML数据的demo

    用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 方案1 当后台返回的数据类型是xml对象 ...

  4. 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!

    本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/694.html ☞ ...

  5. JQuery解析XML数据的几个例子

    用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 第一种方案: <script ty ...

  6. (四)SAX方式解析XML数据

    SAX方式解析XML数据 ​文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...

  7. 导入libxml.dylib用Google的GDataXML解析XML数据

    1.用Google的GDataXML来解析XML数据,导入libxml.dylib 2.导入libxml.dylib的操作实现,一开始自己总是找不到libxml.dylib文件. 选择其他文件,到路径 ...

  8. 【Android Developers Training】 81. 解析XML数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 使用dom4j中SAXReader解析xml数据

    public ApiConfig(String configFilePath) throws DocumentException{ SAXReader reader = new SAXReader() ...

  10. 160708、JQuery解析XML数据的demo

    用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 方案1 当后台返回的数据类型是xml对象 ...

随机推荐

  1. HBase统计表行数(RowCount)的四种方法

    背景:对于其他数据存储系统来说,统计表的行数是再基本不过的操作了,一般实现都非常简单:但对于HBase这种key-value存储结构的列式数据库,统计 RowCount 的方法却有好几种不同的花样,并 ...

  2. ubuntu 18.04安装qq等应用

    deepin-wine 关于deepin-wine的安装参考https://github.com/wszqkzqk/deepin-wine-ubuntu 安装qq后中文乱码的解决方案 1. 安装中文支 ...

  3. 如何在Mac下配置多个Java版本

    使用工具:brew cask brew cask是一个用命令行管理Mac下应用的工具,提供了自动安装和卸载功能,能够自动从官网上下载并安装 最新的版本,它是基于homebrew的一个增强工具. 一. ...

  4. 架构师小跟班:送你一份2019年阿里巴巴最新Java面试题,以供参考

    大家都说大厂面试造飞机,工作拧螺丝.这话只对了一部分,大厂是平时拧螺丝,一旦需要飞机时也能造的起来. 目录 技术一面(23问) 技术二面(3大块) JAVA开发技术面试中可能问到的问题(17问) JA ...

  5. [转]C++ 堆栈溢出的原因以及可行的解决方法

    栈溢出(stackoverflow)的原因及解决办法 大家都知道,Windows程序的内存机制大概是这样的:全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出: 函数地 ...

  6. C# Form 实现桌面弹幕

    使用C# Form 简单的实现了弹幕效果 0. 源代码 : https://github.com/ping9719/-desktop-barrage- 1.创建一个Form 设置  2.添加一个计时器 ...

  7. 微信公众号 $GLOBALS['HTTP_RAW_POST_DATA']数据问题

    公司的微信公众号最近出现问题,所有的功能都不能用,一开始以为是微信公众号验证的问题,经过排查才发现是$GLOBALS['HTTP_RAW_POST_DATA']这里的问题,微信公众号会把用户的一些操作 ...

  8. ubuntu安装vbox虚拟机

    ubuntu安装vbox虚拟机 一.安装准备 1.查看主机配置 二.下载安装包    (建议将安装包下载并保存) a.下载virtualbox安装包 下载链接https://www.virtualbo ...

  9. 【Android】【问题解决记录】Error obtaining UI hierarchy :Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!

    在使用uiautomatorviewer时遇到两类Error obtaining UI hierarchy报错,分别是: Error while obtaining UI hierarchy XML ...

  10. centos安装安全狗5步就能完成

    安全狗是为服务器开发的一款服务器管理软件,客户的服务器是centos 64位,我们就来看看如何安装吧.首先必须得有root账号权限,不然下面的步骤可能都无法执行.随ytkah一起来操作吧 1.下载安全 ...