【Java编程】DOM XML Parser解析、遍历、创建XML

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文件的节点树。

常用的几个对象:

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 ,谢咯!

时间: 2024-10-21 04:03:06

【Java编程】DOM XML Parser解析、遍历、创建XML的相关文章

【Java编程】SAX XML Parser解析、生成XML文件

1.优缺点 优点: SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题.其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求.由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用.支持 XPath 查询的 SAX 使得开发人员更加灵活,处理起 XML 来更加的得心应手. 缺点: 但是同时,其仍然有一些不足

Android中解析与创建XML文件

Android中解析与创建XML文件 在Android中对XML的操作有多种方式,常见的有三种方式:SAX.DOM和PULL方式. DOM方式会把整个XML文件加载到内存中,在PC上常使用DOM的方式. 但是在性能敏感的设备上,主要采用的是SAX的方式,但是缺点是嵌套多个分支的时候处理不是很方便. 而PULL的方式类似SAX方式,同样很节省内存. 因此,本文章中只提供PULL的方式解析与创建XML文件. 基础类 本例中使用的实体类的定义如下: public class CAddress impl

[C# | XML] XML 反序列化解析错误:&lt;xml xmlns=&#39;&#39;&gt; was not expected. 附通用XML到类解析方法

使用 XML 反化时出现错误: public static TResult GetObjectFromXml<TResult>(string xmlString) { TResult result; XmlSerializer serializer = new XmlSerializer(typeof(TResult), new XmlRootAttribute("xml")); using (TextReader tr = new StringReader(xmlStri

JAVA之DOM和SAX解析器

xml的解析器: DOM解析:Document Object Module 文档对象模型 SAX解析:Simple API for XML 用于对 XML 进行语法分析的事件驱动的简单 API JAXP:Java API for XML Processing, 用于XML文档处理的使用Java语言编写的编程接口. 不提供语法分析功能,却提供到达这些语法分析器和结果的方式. (标准和规范) DOM解析:文档对象模型 一次性读入内存,形成树状结构 可以反复频繁访问 不适合操作大的xml文件 DOM解

解析xml文件,遍历输出xml文件中的所有节点, 最终模仿实现struts2框架

程序结构:src文件夹下存放xml文件 该文件内容: <?xml version="1.0" encoding="UTF-8"?> <mystruts> <actions name="myaction1" namespace="/"> <action name="userdao" class="org.action.UserDAO"> &l

Spring MVC-视图解析器(View Resolverr)-XML视图解析器(Xml View Resolver)示例(转载实践)

以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_xmlviewresolver.htm 说明:示例基于Spring MVC 4.1.6. XmlViewResolver用于使用在xml文件中定义的视图bean来解析视图名称.以下示例显示如何使用Spring Web MVC框架使用XmlViewResolver. TestWeb-servlet.xml <bean class="org.springframework.we

XML文件操作类--创建XML文件

这个类是在微软XML操作类库上进行的封装,只是为了更加简单使用,包括XML类创建节点的示例. using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; namespace testForm { class Operation_APPCFG { XmlDocument xmldoc; XmlNode

Java编程的逻辑 (63) - 实用序列化: JSON/XML/MessagePack

上节,我们介绍了Java中的标准序列化机制,我们提到,它有一些重要的限制,最重要的是不能跨语言,实践中经常使用一些替代方案,比如XML/JSON/MessagePack. Java SDK中对这些格式的支持有限,有很多第三方的类库,提供了更为方便的支持,Jackson是其中一种,它支持多种格式,包括XML/JSON/MessagePack等,本文就来介绍如果使用Jackson进行序列化.我们先来简单了解下这些格式以及Jackson. 基本概念 XML/JSON都是文本格式,都容易阅读和理解,格式

python xml文件解析 及生成xml文件

#解析一个database的xml文件 """ <databaselist type="database config"> <database> <host>localhost</host> <username>root</username> <password>11111</password> <datasename>wulaoshi</da