1、前言

DOM XML Parser简介

DOM 它是 W3C 处理 XML 规范 API,这是很多其他的 XML 地基处理相关标准,不仅是 Java,其他的,如 Javascript,PHP。MS .NET 等方面都达到了标准语言。用最为广泛的 XML 处理方式。当然,为了能提供很多其他更加强大的功能,Java 对于 DOM 直接扩展工具类有非常多,比方非常多 Java 程序猿耳熟能详的 JDOM。DOM4J 等等,它们基本上属于对 DOM 接口功能的扩充,保留了非常多 DOM
API 的特性。很多原本的 DOM 程序猿甚至都没有不论什么障碍就熟练掌握了另外两者的使用,直观、易于操作的方式使它深受广大 Java 程序猿的喜爱。

DOM XML Parser优缺点

实现 W3C 标准,有多种编程语言支持这样的解析方式,而且这样的方法本身操作上简单快捷,十分易于刚開始学习的人掌握。其处理方式是将 XML 整个作为类似树结构的方式读入内存中以便操作及解析,因此支持应用程序对 XML 数据的内容和结构进行改动,可是同一时候因为其须要在处理開始时将整个 XML 文件读入到内存中去进行分析,因此其在解析大数据量的 XML 文件时会遇到类似于内存泄露以及程序崩溃的风险,请对这点多加注意。

适用范围:小型 XML 文件解析、须要全解析或者大部分解析 XML、须要改动 XML 树内容以生成自己的对象模型

2、XML DOM节点树

XML DOM将XML文档作为树结构,树结构称为一个节点树。全部的节点能够通过树訪问,它们的内容能够被改动或删除,也能够建立新的元素。节点树用于显示节点集和它们之间的联系。

下图呈现的是books.XML文件的节点树。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5kaWVfZ3Vv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

经常使用的几个对象:

1)Element类:

是Node类最基本的子对象。被广泛使用,在元素中能够包括属性。因而Element中有存取其属性的方法。

2)Node类:

Node对象是DOM中最主要的对象,代表了文档树中的抽象节点。但在实际使用中非常少会直接使用Node对象。而是使用Node对象的子对象Element,Attr,Text等。

3)NodeList类:

代表了一个包括一个或者多个Node的列表,依据操作能够将其简化的看做为数组。

3、DOM XML Parser 解析XML文件

以下给出一段用于解析的 books.xml片段:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Edited by XMLSpy -->
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

Book.java:该对象是一个实体Bean,其字段信息相应着xml文件中的元素字段,因为篇幅有限,读者自行生成get、set方法 。

package com.andieguo.xmldemo;

public class Book {
private String category;
private String titleLang;
private String title;
private String author;
private Integer year;
private Double price; @Override
public String toString() {
return "Book [category=" + category + ", titleLang=" + titleLang + ", title=" + title + ", author=" + author + ", year=" + year + ", price=" + price + "]";
}
//生成字段的get、set方法
}

ReadXMLFile.java :解析XML文件并存入List<Book>集合。

package com.andieguo.xmldemo;

import java.io.File;
import java.util.ArrayList;
import java.util.List; 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; public class ReadXMLFile { public static void main(String[] args) {
File file = new File("src/com/andieguo/xmldemo/books.xml");//books.xml文件应放在和ReadXMLFile.java同级的目录下
List<Book> books = readXMLFile(file);
for (Book book : books) {
System.out.println(book.toString());
}
} public static List<Book> readXMLFile(File file) {
List<Book> lists = new ArrayList<Book>();
try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(file);
NodeList bookList = doc.getElementsByTagName("book");
for (int i = 0; i < bookList.getLength(); i++) {
Node bookNode = bookList.item(i);
if (bookNode.getNodeType() == Node.ELEMENT_NODE) {
Element bookElement = (Element) bookNode;
Book book = new Book();
book.setCategory(bookElement.getAttribute("category"));
Element titleElement = (Element) bookElement.getElementsByTagName("title").item(0);
book.setTitle(titleElement.getTextContent());
book.setTitleLang(titleElement.getAttribute("lang"));
NodeList authorList = bookElement.getElementsByTagName("author");
String author = "";
for (int j = 0; j < authorList.getLength(); j++) {
author = author + authorList.item(j).getTextContent() + "/";
}
author = author.substring(0, author.length() - 1);
book.setAuthor(author);
book.setYear(Integer.valueOf(bookElement.getElementsByTagName("year").item(0).getTextContent()));
book.setPrice(Double.valueOf(bookElement.getElementsByTagName("price").item(0).getTextContent()));
lists.add(book);
} }
} catch (Exception e) {
e.printStackTrace();
}
return lists;
}
}

执行程序后的效果图:

4、DOM XML Parser 遍历XML文件

LoopXMLFile.java:通过迭代遍历xml文件
package com.andieguo.xmldemo;

import java.io.File;

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; public class LoopXMLFile {
public static void main(String[] args) {
loopXMLFile();
} private static void loopXMLFile(){
try {
File file = new File("src/com/andieguo/xmldemo/books.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(file);
if(doc.hasChildNodes()){
printNote(doc.getChildNodes());
}
} catch (Exception e) {
e.printStackTrace();
}
} private static void printNote(NodeList nodeList){
for(int i=0; i<nodeList.getLength();i++){
Node node = nodeList.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE){
System.out.println("<"+node.getNodeName()+">");
System.out.println(node.getTextContent());
if(node.hasAttributes()){
NamedNodeMap nodeMap = node.getAttributes();
for(int j=0;j<nodeMap.getLength();j++){
Node nd = nodeMap.item(j);
System.out.println(nd.getNodeName()+"="+nd.getNodeValue());
}
}
if(node.hasChildNodes()){
printNote(node.getChildNodes());
}
System.out.println("<" + node.getNodeName() + "/>");
} }
}
}

5、DOM XML Parser 创建XML文件

CreateXMLFile.java:

将集合List<Book>中的数据填充构建的XML文件里,读者可结合第2节 XML DOM树图来理解整个XML文件节点的生成、加入构建过程。

特别注意:

对于XML文件里的元素<year>2500</year>而言。2500不是<year>元素的值,而是<year>元素的一个TextNode节点。所以才有year.appendChild(doc.createTextNode(books.get(i).getYear().toString()));这种语句存在。

package com.andieguo.xmldemo;

import java.io.File;
import java.util.List; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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; public class CreateXMLFile { public static void main(String[] args) {
File file = new File("src/com/andieguo/xmldemo/books.xml");//books.xml文件应放在和CreateXMLFile.java同级的目录下
List<Book> books = ReadXMLFile.readXMLFile(file);
createXMLFile(books);
} public static void createXMLFile(List<Book> books) {
Document doc;
Element bookstore;
Element book;
Element title;
Element author;
Element year;
Element price;
try {
// 得到DOM解析器的工厂实例
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
// 从DOM工厂中获得DOM解析器
DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
// 创建文档树模型对象
doc = dbBuilder.newDocument();
if (doc != null) {
bookstore = doc.createElement("bookstore");
for (int i = 0; i < books.size(); i++) {
book = doc.createElement("book");
//设置元素book的属性值
book.setAttribute("category", books.get(i).getCategory());
//创建名称为title的元素
title = doc.createElement("title");
//创建文本节点并作为子节点加入到title元素中
title.appendChild(doc.createTextNode(books.get(i).getTitle()));
//设置元素title的属性值
title.setAttribute("lang", books.get(i).getTitleLang());
//将title子元素加入到book中
book.appendChild(title);
String[] strAuthor = books.get(i).getAuthor().split("/");
for(int j=0;j<strAuthor.length;j++){
author = doc.createElement("author");
author.appendChild(doc.createTextNode(strAuthor[j]));
book.appendChild(author);//将多个author子元素加入到book中
}
year = doc.createElement("year");
year.appendChild(doc.createTextNode(books.get(i).getYear().toString()));
book.appendChild(year);//将year子元素加入到book中
price = doc.createElement("price");
price.appendChild(doc.createTextNode(books.get(i).getPrice().toString()));
book.appendChild(price);//将price子元素加入到book中
bookstore.appendChild(book); //将book作为子元素加入到树的根节点bookstore
}
doc.appendChild(bookstore);//加入到文档树中 TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("src/com/andieguo/xmldemo/createbooks.xml")); transformer.transform(source, result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

执行程序后的效果图:

參考:

Java 处理 XML 的三种主流技术及介绍

http://www.ibm.com/developerworks/cn/xml/dm-1208gub/

XML DOM Node Tree

http://www.w3schools.com/dom/dom_nodetree.asp

How To Read XML File In Java – (DOM Parser)

http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

How To Create XML File In Java – (DOMParser)

http://www.mkyong.com/java/how-to-create-xml-file-in-java-dom/

org.w3c.dom(java dom)解析XML文档

http://www.cnblogs.com/shenliang123/archive/2012/05/11/2495252.html

友情提示:

转载请注明出处http://blog.csdn.net/andie_guo/article/details/24844351 。谢略。

版权声明:本文博主原创文章。博客,未经同意不得转载。

【Java规划】DOM XML Parser分解、遍历、创XML的更多相关文章

  1. 解析xml文件,遍历输出xml文件中的所有节点, 最终模仿实现struts2框架自动封装参数的功能

    程序结构:src文件夹下存放xml文件 该文件内容: <?xml version="1.0" encoding="UTF-8"?> <myst ...

  2. PHP XML Parser 函数

    PHP XML Parser 简介 XML 函数允许您解析 XML 文档,但无法对其进行验证. XML 是一种用于标准结构化文档交换的数据格式.您可以在我们的 XML 教程 中找到更多有关 XML 的 ...

  3. [java开发篇][dom模块] 遍历解析xml

    http://blog.csdn.net/andie_guo/article/details/24844351 XML DOM节点树 XML DOM将XML文档作为树结构,树结构称为一个节点树.所有的 ...

  4. JAva使用DOM读取XML数据(解析)

    原来一切都是有套路的 使用DOM解析XML文档步骤 1.创建解析器工厂对象 DocumentBuildFactory对象 2.由解析器工厂对象创建解析器对象,即DocumentBuilder对象 3. ...

  5. Java中Dom解析xml文档

    xml文档 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id ...

  6. Java中Dom解析XML

    DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方式便于对XML节点的添加修改等,而且解析也很方便,然后它比较耗费内存 ...

  7. java使用DOM操作XML

    XML DOM简介 XML DOM 是用于获取.更改.添加或删除 XML 元素的标准. XML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 XML 标签是一个 ...

  8. Java用DOM操作xml

    JAXP DOM方式解析XML文档实例增删改查package jiexi; import javax.xml.parsers.DocumentBuilder; import javax.xml.par ...

  9. java通过dom读写xml文件

    java通过dom读写xml文件 要读的xml文件 <?xml version="1.0" encoding="GB2312"?><学生花名册 ...

随机推荐

  1. python3实现邮件发送程序

    刚开始的想法很简单,由于有上千封的邮件需要发出去,并且需要一条一条发送,不能转发或群发,每条邮件要署对方的姓名,并加上几个相同的符件,考虑到手工操作繁琐无趣,所以想到用程序实现,python好像非常胜 ...

  2. 如何为jquery添加方法

    以下内容引自一位网友的帖子: jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery ...

  3. js时间戳与日期格式之间的互转

    1. 将时间戳转换成日期格式 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 注意:如果是uinx时间戳记得乘于1000.比如php函数time()获得 ...

  4. How do I solve the error: An error was encountered while running (Domain = LaunchServicesError, Code = 0) ?

    How do I solve the error: An error was encountered while running (Domain = LaunchServicesError, Code ...

  5. TC2.0中怎样调用汇编程序

    转载于: TC2.0中怎样调用汇编程序 一.概述 TC是美国BORLAND 公司在IBM PC机上开发的一个高效.优化的C编译程序,它自带高效的全屏幕编辑程序,在集成开发环境下可支持编辑.编译.连接调 ...

  6. 转:2014年最酷的30个JavaScript库

    原文来自于:http://www.gbtags.com/gb/share/3701.htm 使用JavaScript库将会使开发变的更简单,大部分JavaScript库提供的功能都是极好的,当我们在为 ...

  7. Node.js教程

    Node.js是什么? Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的服务器端平台.Node.js是由瑞恩·达尔在2009年开发的,它的最新版本是v0.10.36. N ...

  8. Oracle开始从Java运行时中移除JAR包

    早在2012年8月,在Java平台首席架构师Mark Reinhold宣布模块化项目Jigsaw之后不久,JEP 162这一题为“准备模块化”的提案就指出,在Jigsaw项目中为模块化系统开发的代码不 ...

  9. Unity3d webplayer获取url参数

    Unity3d webplayer获取url参数 1.Unity中代码,在Start方法中调用了HTML的GetUrl方法!Application.ExternalCall( "SayHel ...

  10. GCD - Extreme (II)

    uva11424: 题目:给出n,求gcd(1,2)+gcd(1,3)+gcd(2,3)+gcd(1,4)+gcd(2,4)+gcd(3,4)+...+gcd(1,n)+gcd(2,n)+...+gc ...