`

Java解析XML数据(一)——DOM解析

阅读更多

在使用Java解析XML文档之前,我们先来了解了解什么是XML。

 

XML即可扩展的标记语言,可以定义语义标记(标签),是元标记语言。XML不像超文本标记语言HTML,HTML只能使用规定的标记,对于XML,用户可以定义自己需要的标记。XML(eXtensible Markup Language)和HTML(Hyper Text Markup Language)师出同门,都是从SGML(Standard Generalized Markup Language)延伸而出的标记语言。

 

一、解析数据之前,先创建一个XML文档

 

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book isbn="223">
		<title>三体</title>
		<author>刘慈欣</author>
		<price>59</price>
	</book>
	<book isbn="456">
		<title>失控</title>
		<author>KK</author>
		<price>99</price>
	</book>
	<book isbn="789">
		<title>冰与火</title>
		<author>乔治马丁</author>
		<price>129</price>
	</book>
</books>
 可以看到,XML的编写与HTML相比,用户可以自定义标签,当然,标签的自定义也需要符合面向对象编程中的逻辑思想。

 

 

二、DOM解析原理

DOM,Document Object Model,文档对象模型。DOM是html和xml文档的编程接口规范,和平台、语言是无关的。利用dom规范,能够实现dom 文档和xml之间的相互转换,遍历、操作相应dom文档的内容。

 

DOM规范的核心就是树模型

 

此外,JDOM是Java和DOM的结合体。JDOM 致力于建立一个完整的基于 Java 平台的、通过 Java 代码来访问、操作并输出 XML 数据。JDOM是用Java语言读、写、操作XML的新API函数。

 

DOM解析的原理如下图所示。



 

三、利用Eclipse创建一个Java项目,创建一个与XML文档相对应的类Book.java,如下:

 

public class Book {

	// 书版本号
	private String isbn;
	
	// 书标题
	private String title;
	
	// 书作者
	private String author;
	
	// 书价格
	private int price;

	public Book() {
		
	}
	
	/**
	 * 构造方法
	 * 
	 * @param isbn
	 *            版本号
	 * @param title
	 *            标题
	 * @param author
	 *            作者
	 * @param price
	 *            价格
	 */
	public Book(String isbn, String title, String author, int price) {
		super();
		this.isbn = isbn;
		this.title = title;
		this.author = author;
		this.price = price;
	}

	/**
	 * 获得书版本号
	 * 
	 * @return 版本号
	 */
	public String getIsbn() {
		return isbn;
	}

	/**
	 * 设置书版本号
	 * 
	 * @param isbn
	 *            版本号
	 */
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	/**
	 * 获得书标题名字
	 * 
	 * @return 标题
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * 设置书标题名字
	 * 
	 * @param title
	 *            标题名字
	 */
	public void setTitle(String title) {
		this.title = title;
	}

	/**
	 * 获得书的作者名字
	 * 
	 * @return 作者名字
	 */
	public String getAuthor() {
		return author;
	}

	/**
	 * 设置书的作者名字
	 * 
	 * @param author
	 *            作者名字
	 */
	public void setAuthor(String author) {
		this.author = author;
	}

	/**
	 * 获得书的价格
	 * 
	 * @return 价格
	 */
	public int getPrice() {
		return price;
	}

	/**
	 * 设置书的价格
	 * 
	 * @param price
	 *            价格
	 */
	public void setPrice(int price) {
		this.price = price;
	}

	/**
	 * 重写Object继承下来的toString方法,用于将书的字段变成字符串对象
	 */
	@Override
	public String toString() {
		return "Book [isbn=" + isbn + ", title=" + title + ", author=" + author
				+ ", price=" + price + "]";
	}

}
 

 

四、将第一步中的book.xml放置在该项目的目录下,便于java中使用相对路径找到该文件

 

五、创建一个包含main(主方法)的主类,用于解析book.xml文档,为其创建一个readXML的静态方法,因为要在main方法中进行调用,具体代码如下:

 

public class RWTest {

	public static void main(String[] args) {
		readXML();
	}
        private static void readXML() {
		// 1.获得解析器工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			// 2.通过工厂获得解析器
			DocumentBuilder builder = factory.newDocumentBuilder();
			// 3.指定要解析的xml文件
			File file = new File("book.xml");
			// 4.解析数据:file ----> doc(树形结构)
			Document doc = builder.parse(file);
			// 创建一个列表用来保存book信息
			List<Book> list = new ArrayList<>();
			/*
			 * 节点 Node 1 元素节点 Element 2 属性节点 Attr 3 文本节点 Text
			 */
			// 通过标签取该xml文件中所有的Book标签,返回一个链表
			NodeList nodeList = doc.getElementsByTagName("book");
			// 解析每一个book元素,并将解析的数据存放到Book对象中
			for (int i  = 0; i < nodeList.getLength(); i++) {
				// 从nodeList中获得结点元素
				Element eBook = (Element) nodeList.item(i);
				Attr aIsbn = eBook.getAttributeNode("isbn");
				String isbn = aIsbn.getValue();
				Element eTitle = (Element) eBook.getElementsByTagName("title").item(0);
				String title = eTitle.getTextContent();
				String author = eBook.getElementsByTagName("author").item(0).getFirstChild().getNodeValue();
				String strPrice = eBook.getElementsByTagName("price").item(0).getTextContent();
				int price = Integer.parseInt(strPrice);
				// 将解析的数据存储到Book对象
				Book book = new Book(isbn, title, author, price);
				// 将book对象存放到list列表中
				list.add(book);
				// System.out.println(eTitle.getTextContent());
			}
			// 输出list
			for (Book b : list) {
				System.out.println(b);
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 
六、运行效果截图:

 
七、利用Java语言创建XML文档
在第五步创建的RWTest.java类(主类)中,再添加一个静态方法writeXML,然后再main方法中之直接调用,查看其效果。
private static void writeXML() {
		// 保存书的list列表
		ArrayList<Book> list = new ArrayList<>();
		// 添加两本书
		list.add(new Book("111", "Java语言学习", "Oracle", 39));
		list.add(new Book("222", "Android编程学习", "Google", 49));
		// Object ------> XML
		// 1.生成doc树形结构
		// (1)创建文档解析器
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			// (2)通过工厂获得解析器对象
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.newDocument();
			Element root = doc.createElement("books");
			// (3)遍历对象列表,生成book子树
			for (int i = 0; i < list.size(); i++) {
				Element book = doc.createElement("book");
				// 设置book的属性和子结点
				/*// 设置book的isbn属性————————方法一
				book.setAttribute("isbn", list.get(i).getIsbn());*/
				// 设置book的isbn属性————————方法二
				Attr attrIsbn = doc.createAttribute("isbn");
				attrIsbn.setValue(list.get(i).getIsbn());
				book.setAttributeNode(attrIsbn);
				// 设置book的子元素结点:title——————方法一
				// 创建title元素结点
				Element title = doc.createElement("title");
				title.setTextContent(list.get(i).getTitle());
				// 设置book的子元素结点:author——————方法二
				// 创建author元素结点
				Element author = doc.createElement("author");
				// 创建一个文本结点
				Text text = doc.createTextNode(list.get(i).getAuthor());
				author.appendChild(text);
				// 设置book的子元素结点:price——————采用方法一添加
				// 创建price元素结点
				Element price = doc.createElement("price");
				price.setTextContent(String.valueOf(list.get(i).getPrice()));
				// 将子结点元素添加到book结点中
				book.appendChild(title);
				book.appendChild(author);
				book.appendChild(price);
				// book对象已经 成功转成了book子树
				root.appendChild(book);
			}
			doc.appendChild(root);
			// 2.将树形结构写入磁盘文件,并保存为xml文件
			// (1)创建一个转换器对象
			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			// (2)创建源对象(树形结构)
			Source source = new DOMSource(doc);
			// (3)创建目标对象(xml文件)
			Result result = new StreamResult(new File("book2.xml"));
			// (4)开始转换
			transformer.transform(source, result);
			// (5)转换成功
			System.out.println("转换成功");
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerFactoryConfigurationError e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
 
注意:创建XML的时候需要指定XML文档所在的磁盘文件位置,所以在代码中最好先直接以名字指明,这样只要刷新项目就可以看到新建好的XML文档(我这里显示的是book2.xml),如下图所示。
 直接打开book2.xml可以看到根据代码生成好的内容,如下图所示。

 

 

后面还会继续将利用Sax解析和第三方包的方法来解析XML文档。

 

谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~微笑微笑微笑

 

 

 

 

  • 大小: 29.8 KB
  • 大小: 13.4 KB
  • 大小: 3.4 KB
  • 大小: 18.1 KB
分享到:
评论

相关推荐

    java解析xml——dom

    java程序中使用dom解析xml文件介绍

    使用DOM解析XML和使用SAX解析XML

    java学习笔记——使用DOM解析XML和使用SAX解析XML

    java工具类——dom4j

    dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。

    Java Web 开发实战经典(基础篇)

    010302_XML解析 —— DOM 010303_XML解析 —— SAX 010304_XML解析 —— JDOM 010305_XML解析 —— DOM4J 010306_使用JavaScript操作DOM 010401_Tomcat服务器的安装及配置 020501_注释及Scriptlet 020502_page指令 ...

    xml入门项目——通讯录系统

    xml入门小项目——通讯录系统 系统特点: 1、系统主程序入口MainProgram.java ...系统xml文档通过dom4j技术创建和解析。 3、涉及JavaSE中的集合、泛型、接口文件及其实现类的应用等。 4、涉及junit测试方法的使用

    Android 创建与解析XML(五)——详解Dom4j方式

    本篇文章主要介绍了Android创建与解析XML(二)——详解Dom4j方式,这里整理了详细的代码,有需要的小伙伴可以参考下。

    XML——sax解析 极速入门易懂示例

    学习xml——sax解析的项目小示例 非常简单易懂 而且包括多种sax解析的方法 如xmlReader,saxBuilder工厂,还包括一个dom解析的示例(DocumentBuilder工厂)

    Android程序技术:个人学习助手项目习题详情显示.pptx

    DOM解析 逐行扫描XML文件,读取文件的同时即可进行解析处理,不必等到文件加载结束。缺点是无法进行增、删、改等操作。 SAX解析 一个开源的Java项目,既可以用于Android应用,也可以用于JavaEE程序。Android中已经...

    XML文档解析相关工具

    工具内容包括java程序开发中文件配置解析需要实用的jar包工具——[dom4j-1.6.1.jar]&[jaxen-1.1-beta-6.jar]

    xerces-c++-3.1.3

    XML4C 和 XML4J 是两个并列的项目,而 XML4J 是 Xerces-J——Java 实现——的前身。IBM 将这两个项目的源代码让与 Apache 软件基金会(Apache Software Foundation),他们将其分别改名为 Xerces-C++ 和 Xerces-J。注...

    北京中科信软AJAX培训

    操纵和解析XML 选择合适的XML生成方式 XHTML与CSS XHTML、CSS与Ajax XHTML与CSS基础 XHTML语法约束 JavaScript JavaScript与Ajax JavaScript基本数据结构 JavaScript表达式和运算符 JavaScript的流程控制和函数 ...

    老罗android开发视频教程全集百度网盘下载

    【第一版第四章】老罗Android开发视频--解析XML数据(3集) 【第一版第五章】老罗Android开发视频--解析JSON数据(4集) 【第一版第六章】老罗Android开发视频--服务器端JDBC编程(2集) 【第一版第七章】老罗...

    Java JDK实例宝典

    19 线程——BlockingQueue 第17章 Java与XML 17. 1 用DOM处理XML文档 17. 2 用SAX处理XML文档 17. 3 用XSLT转换XML 17. 4 对象与XML的转换 第18章 Java Mail 18. 1 使用SMTP协议发送...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

    java web 视频、电子书、源码(李兴华老师出版)

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

    Python爬取数据并存入MongoDB

    最近和朋友一起开发APP,需要大量数据,而”互联网”与”共享”融合发展的理念,遂资源的可重用给予了当代骚客文人获得感与幸福感…好了,不日白了(正宗重庆话,吹牛的意思),开始正题 BeautifulSoup4 本人是做...

    李兴华Java Web开发实战经典(高清版) Part2

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

Global site tag (gtag.js) - Google Analytics