2017/4/26-DOM解析XML文件
DOM解析XML
1、分析
DOM是JAVA自带的XML解析API。DOM首先将XML文件全部加载至内存中,然后再内存中创建DOM树,生成DOM树上的每个Node节点。
2、优点
1) 可以创建或修改XML文件内容。
2) 进行XSLT转换。
3) 进行Xpath过滤。
3、缺点
1) 由于DOM会先把XML文件加载至内存中并使用DOM树,因此文件过大时,会占用非常多的内存。
2) 相对于SAX,效率上也会有明显的下降。
4、适用场合
1) 当需要对XML文档进行修改或者创建XML文档时,可以使用DOM。
2) 当XML文件很小时,可以忽略加载后占用的内存大小时,可以使用DOM。
3) 进行XSLT转换或者Xpath过滤时,可以使用DOM。
5、讲解
1) 相对于SAX而言,DOM的开发量会比较小。
2) 先从DocumentBuilderFactory中获取DocumentBuilderFactory对象,使用newInstance()方法。
3) 从步骤2的对象中拿取DocumentBuilder对象,使用newDocumentBuilder()方法。
4) 将xml文件转换成Document对象,加载至内存中,使用步骤3对象的parse(InputStream is)方法,其中“is”参数为XML文件的输入流。
5) 使用Document对象过去Element对象。该Element对象则为根节点。
6) 判断根节点下是否有子节点,若有则进行遍历,获取Node对象,Node对象则为子节点。
7) 判断子节点下是否有其他子节点,若有则遍历,以此类推。(可以使用递归方法进行查询)
6、详解
1) XML文件示例
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<id>10001</id>
<name>JAVA BOOK</name>
<author>James Gosling</author>
<publishDate>2017-04-24</publishDate>
</book>
<book>
<id>10002</id>
<name>C BOOK</name>
<author>Dennis Ritchie</author>
<publishDate>2017-04-24</publishDate>
</book>
</books>
2) DOM解析XML文件demo
package com.mean.xml.dom.demo; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; /**
* @author mean
*
*/
public class DomDemo { public DomDemo() { } /**
* DOM解析XML主要方法
* */
public static void analysis() {
DocumentBuilderFactory domBuilderFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder domBuilder = domBuilderFactory.newDocumentBuilder();
Document dom = domBuilder.parse(DomDemo.class.getResourceAsStream("/Book.xml"));
Element books = dom.getDocumentElement(); // root节点(books)
if (books.hasChildNodes()) {
NodeList booksList = books.getChildNodes();
for (int i = 0, l = booksList.getLength(); i < l; i++) {
Node book = booksList.item(i); // books下的子节点(book)
if (book.hasChildNodes()) {
NodeList bookList = book.getChildNodes();
System.out.println("----------书本内容----------");
for (int j = 0, len = bookList.getLength(); j < len; j++) {
Node sonNode = bookList.item(j); // book下的子节点(id,name,author,publishData)
if (sonNode.getNodeType() == Element.ELEMENT_NODE) {
System.out.println("nodeName:" + sonNode.getNodeName() + " ,nodeValue:"
+ sonNode.getTextContent().trim());
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
DomDemo.analysis();
} }
3) DOM解析XML文件,递归遍历各节点demo(慎用)
package com.mean.xml.dom.demo; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; /**
* 递归方法遍历各节点
* @author mean
*/
public class DomTraversalNodeDemo { public DomTraversalNodeDemo() { } /**
* DOM解析XML主要方法
* */
public static void analysis() {
DocumentBuilderFactory domBuilderFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder domBuilder = domBuilderFactory.newDocumentBuilder();
Document dom = domBuilder.parse(DomDemo.class.getResourceAsStream("/Book.xml"));
Element books = dom.getDocumentElement(); // root节点(books)
if (books.hasChildNodes()) {
NodeList booksList = books.getChildNodes();
for (int i = 0, l = booksList.getLength(); i < l; i++) {
Node book = booksList.item(i); // books下的子节点(book)
if (book.getNodeType() == Element.ELEMENT_NODE) {
System.out.println("---------book-----------");
traversalNode(book);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 遍历子节点
* */
public static void traversalNode(Node node) {
// 该判断是为了防止将换行输出,因为DOM中会把回车也会当做节点
if (node.getNodeType() != Element.TEXT_NODE) {
// 若node下有子节点了,则进行节点遍历
if (node.hasChildNodes()) {
NodeList nodeList = node.getChildNodes();
if (nodeList.getLength() == 1 && (nodeList.item(0).getNodeType() == Element.TEXT_NODE)) {
System.out
.println("nodeName:" + node.getNodeName() + " ,nodeValue:" + node.getTextContent().trim());
} else {
for (int i = 0, l = nodeList.getLength(); i < l; i++) {
Node sonNode = nodeList.item(i);
traversalNode(sonNode);
}
}
} }
} public static void main(String[] args) {
DomTraversalNodeDemo.analysis();
}
}
7、引用
1) 本文借鉴博客网址:http://blog.csdn.net/zhangxinrun/article/details/5678118
2017/4/26-DOM解析XML文件的更多相关文章
- 使用DOM解析xml文件
使用DOM解析xml文件 要解析的xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <Langu ...
- DOM解析XML文件例子
DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式. 一般分为以下几步: 1. 定义好目标XML文件路径path . 2. 实例化DOM解析工厂对象 ,Document ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- 使用DOM解析XML文件,、读取xml文件、保存xml、增加节点、修改节点属性、删除节点
使用的xml文件 <?xml version="1.0" encoding="GB2312" ?> <PhoneInfo> <Br ...
- dom 解析xml文件
JAXP技术 JAXP即Java Api for Xml Processing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术.大家可以参见SUN的以下两 ...
- DOM解析XML文件实例
XML文件: response: <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www ...
- Qt中使用DOM解析XML文件或者字符串二(实例)
介绍 在Qt中提供了QtXml模块实现了对XML数据的处理,我们在Qt帮助中输入关键字QtXml Module,可以看到该模块的类表.在这里我们可以看到所有相关的类,它们主要是服务于两种操作XML文档 ...
- Python—使用xm.dom解析xml文件
什么是DOM? 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口. 一个 DOM 的解析器在解析一个 XML 文档时,一次性读 ...
- DOM解析XML文件
1.首先把第三方代码拖进工程 GDataXMLNode.h和GDataXMLNode.m这两个文件放进工程里面 2.引入libxml2库文件 3.将GDataXMLNode.h文件中的这两个东西在工程 ...
- Dom解析XML文件具体用法
public class Dom4j { public static void main(String[] args) throws Exception { List<Student> l ...
随机推荐
- 聊聊"jQuery is not defined"
KiwenLau同学在他的个人博客使用了Fundebug的JavaScript错误监控插件,然后偶尔会收到jQuery is not defined这样的错误报警: 他的博客使用了Staticfile ...
- 1022: [SHOI2008]小约翰的游戏John
1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1322 Solved: 829[Submit][ ...
- Maven工具的使用总结
Maven作为构建工具,现在项目开发使用的越来越多,相对于ant和gradle,我更喜欢使用maven,先总结maven使用的一系列知识: 一.maven相关的网址: 名称 地址 其他 maven官网 ...
- LODOP的一次使用后的总结
一.lodop打印预览效果图 LODOP.PRINT_SETUP();打印维护效果图 LODOP.PREVIEW();打印预览图 二.写在前面 最近项目用到了LODOP的套打,主要用到两个地方,一是物 ...
- 添加swagger api文档到node服务
swagger,一款api测试工具,详细介绍参考官网:http://swagger.io/ ,这里主要记录下怎么将swagger api应用到我们的node服务中: 1.任意新建node api项目, ...
- python——时间与时间戳之间的转换
http://blog.csdn.net/google19890102/article/details/51355282
- ELK5.0安装教程
ELK升级后,安装稍微发生了点变化,在Elasticsearch中增加了很多资源上的限制,其他的倒是没什么变化.不过所有的安装都是基于JDK已经安装完的情况,且为1.8版本. 安装Elasticsea ...
- Redis(2015.08.03笔记一)
一.redis简介 Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串 redis的值支持多种数据类型: 1:字符 ...
- iOS开发之iOS程序的启动过程
程序启动的完整过程: (1)main函数 (2)UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 (3)delega ...
- CSS.06 -- 尚合网页模拟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...