
XML DOM解析(Java)的一个简单实例
发布日期:2021-05-09 05:16:45
浏览次数:17
分类:博客文章
本文共 3776 字,大约阅读时间需要 12 分钟。
关于DOM解析的基础内容见上一篇文章:
JAXP(Java API for XML Parsing) :用于XML解析的Java API。
本文通过一个实际的代码例子来说明如何用Java提供的DOM相关的类和接口解析XML:
首先,是XML文档:books.xml
Harry Potter J K. Rowling 2005 29.99 Everyday Italian Giada De Laurentiis 2005 30.00 Learning XML Erik T. Ray 2003 39.95 XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99
把这个文档放在项目的根路径下,与src目录平行,就可以使用相对路径来引用了。
新建Java类,解析如下:
package com.example.xml.dom;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class DomTest1{ public static void main(String[] args) throws Exception { // step 1:获得DOM解析器工厂 // 工厂的作用是创建具体的解析器 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // step 2:获得具体的dom解析器 DocumentBuilder db = dbf.newDocumentBuilder(); // step 3:解析一个xml文档,获得Document对象(根节点) // 此文档放在项目目录下即可 Document document = db.parse(new File("books.xml")); // 根据标签名访问节点 NodeList list = document.getElementsByTagName("book"); System.out.println("list length: " + list.getLength()); // 遍历每一个节点 for (int i = 0; i < list.getLength(); ++i) { System.out.println("----------------------"); // 获得元素,将节点强制转换为元素 Element element = (Element) list.item(i); // 此时element就是一个具体的元素 // 获取子元素:子元素title只有一个节点,之后通过getNodeValue方法获取节点的值 String content0 = element.getElementsByTagName("title").item(0) .getNodeValue(); System.out.println(content0);// 此处打印出为null // 因为节点getNodeValue的值永远为null // 解决方法:加上getFirstChild() String content = element.getElementsByTagName("title").item(0) .getFirstChild().getNodeValue(); System.out.println("title: " + content);// 此处打印出书名 // 后面类似处理即可: content = element.getElementsByTagName("author").item(0) .getFirstChild().getNodeValue(); System.out.println("author: " + content); content = element.getElementsByTagName("year").item(0) .getFirstChild().getNodeValue(); System.out.println("year: " + content); content = element.getElementsByTagName("price").item(0) .getFirstChild().getNodeValue(); System.out.println("price: " + content); } }}
具体过程参见注释。
首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
我们在这里使用DocumentBuilderFactory的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。
又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。
所以当在不同的解析器之间进行切换时,值需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。
DocumentBuilder db = dbf.newDocumentBuilder();
当获得一个工厂对象之后,使用它的静态方法newDocumentBuilder(),可以获得一个DocumentBuilder对象。
这个对象代表了具体的DOM解析器。
解析器的具体实现对于程序来说并不重要。
然后,我们就可以利用这个解析器对文档进行解析了。
Sun公司提供了默认的工厂和默认的解析器,上面的例子中就使用了默认的解析器。
参考资料
圣思园张龙老师XML视频教程。
w3school XML DOM 教程:
Java API文档:
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月23日 21时21分13秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[Python学习笔记]组织文件
2021-05-09
快服务流量之争:如何在快服务中占领一席之地
2021-05-09
Spring Boot 2.x基础教程:构建RESTful API与单元测试
2021-05-09
dojo/request模块整体架构解析
2021-05-09
互联网App应用程序测试流程及测试总结
2021-05-09
如何使用google搜索?
2021-05-09
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
2021-05-09
(在模仿中精进数据可视化07)星球研究所大坝分布可视化
2021-05-09
(数据科学学习手札27)sklearn数据集分割方法汇总
2021-05-09
从零开始学安全(十六)● Linux vim命令
2021-05-09
阿里巴巴Json工具-Fastjson教程
2021-05-09
Spring Cloud Gateway - 快速开始
2021-05-09
Java对象转JSON时如何动态的增删改查属性
2021-05-09
Python 面向对象进阶
2021-05-09
Linux常用统计命令之wc
2021-05-09
并发编程——IO模型详解
2021-05-09
Java之封装,继承,多态
2021-05-09
使用js打印时去除页眉页脚
2021-05-09
Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)
2021-05-09