XML的DOM解析 Java实现 使用递归解析一个XML文档
XML的DOM解析 Java实现 使用递归解析一个XML文档
本文是一个练习程序,程序解析了一个XML文档,并将其原样输出在命令行上。
因为要把程序设计成适用于任何XML文档,所以需要使用递归,其中还必须加入元素类型的判断。
详见程序:
本文使用的XML文档:
<?xml version="1.0" encoding="UTF-8"?> <学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Course30\student.xsd"> <!-- 注释:学生1 --> <学生 学号="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("<!--"); Comment comment = (Comment) node; // 注释内容 String data = comment.getData(); System.out.print(data); System.out.print("-->"); } } // 所有内容处理完之后,输出,关闭根节点 System.out.print("</" + tagName + ">"); } }
参考资料
圣思园张龙老师视频教程。
Java官方文档:http://docs.oracle.com/javase/7/docs/api/index.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了