
XML的DOM解析 Java实现 使用递归解析一个XML文档
发布日期:2021-05-09 05:16:46
浏览次数:11
分类:博客文章
本文共 2854 字,大约阅读时间需要 9 分钟。
XML的DOM解析 Java实现 使用递归解析一个XML文档
本文是一个练习程序,程序解析了一个XML文档,并将其原样输出在命令行上。
因为要把程序设计成适用于任何XML文档,所以需要使用递归,其中还必须加入元素类型的判断。
详见程序:
本文使用的XML文档:
<学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nonamespaceschemalocation="C:\Course30\student.xsd"> <学生 学号="1"> <姓名> 张三 姓名> <性别> 男 性别> <年龄> 20 年龄> 学生> <学生 学号="2"> <姓名> 李四 姓名> <性别> 女 性别> <年龄> 19 年龄> 学生> <学生 学号="3"> <姓名> 王五 姓名> <性别> 男 性别> <年龄> 21 年龄> 学生> 学生名册>
Java程序:
package com.learnjava.xml.dom;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Attr;import org.w3c.dom.Comment;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;/** * 使用递归解析一个XML文档并且将其内容输出到命令行上 * */public class DomTest3{ public static void main(String[] args) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File("student.xml")); // 获取根元素节点 Element root = doc.getDocumentElement(); parseElement(root); } private static void parseElement(Element element) { String tagName = element.getNodeName(); System.out.print("<" + tagName); // element元素的所有属性构成的NamedNodeMap对象,需要对其进行判断 NamedNodeMap map = element.getAttributes(); // 如果存在属性,则打印属性 if (null != map) { for (int i = 0; i < map.getLength(); i++) { // 获得该元素的每一个属性 Attr attr = (Attr) map.item(i); // 属性名和属性值 String attrName = attr.getName(); String attrValue = attr.getValue(); // 注意属性值需要加上引号,所以需要\转义 System.out.print(" " + attrName + "=\"" + attrValue + "\""); } } // 关闭标签名 System.out.print(">"); // 至此已经打印出了元素名和其属性 // 下面开始考虑它的子元素 NodeList children = element.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { // 获取每一个child Node node = children.item(i); // 获取节点类型 short nodeType = node.getNodeType(); if (nodeType == Node.ELEMENT_NODE) { // 如果是元素类型,则递归输出 parseElement((Element) node); } else if (nodeType == Node.TEXT_NODE) { // 如果是文本类型,则输出节点值,及文本内容 System.out.print(node.getNodeValue()); } else if (nodeType == Node.COMMENT_NODE) { // 如果是注释,则输出注释 System.out.print(" "); } } // 所有内容处理完之后,输出,关闭根节点 System.out.print(" "); }}
参考资料
圣思园张龙老师视频教程。
Java官方文档:
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月25日 14时00分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python装饰器实现对异常代码出现进行监控
2019-03-06
django+appium实现UI自动化测试平台(开源部分,可定制开发)
2019-03-06
PAT 1008. Elevator (20)
2019-03-06
蓝桥杯 密码脱落 LCS
2019-03-06
第七届C/C++B-方格填数 DFS
2019-03-06
数据结构课设--3哈夫曼编码译码系统(树应用)
2019-03-06
pku 1061 青蛙的约会 扩展欧几里得
2019-03-06
Spring Boot 2.4 配置文件将加载机制大变化
2019-03-06
javascript 用函数语句和表达式定义函数的区别
2019-03-06
基于react hooks,antd4 配置生成表单并自动排列
2019-03-06
也来玩玩 javascript对象深拷贝,浅拷贝
2019-03-06
Kubernetes实战总结 - 动态存储管理StorageClass
2019-03-06
Django实战总结 - 快速开发一个Web服务
2019-03-06
Oracle一次缩小表空间的处理过程
2019-03-06
【三思笔记】 全面学习Oracle分区表及分区索引
2019-03-06
wcf webHttpBinding Post 大数据量提交 ios c#客户端
2019-03-06
[LeetCode题解]141. 环形链表 | 快慢指针
2019-03-06
MySQL错误日志(Error Log)
2019-03-06
MySQL二进制文件(binlog)
2019-03-06