<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<学生名册>
<学生 学号="1">
<姓名>张三</姓名>
<!-- haha -->
<性别>男</性别>
<年龄>20</年龄>
</学生>
<学生 学号="2">
<姓名>李四</姓名>
<性别>女</性别>
<年龄>19</年龄>
</学生>
<学生 学号="3">
<姓名>王五</姓名>
<性别>男</性别>
<年龄>21</年龄>
</学生>
</学生名册>
package com.syh.xml.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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文档并且将其内容输出到命令行上
* @author Administrator
*
*/
public class DomTest4 {
public static void main(String[] args) throws Exception {
// 获得 dom 解析器工厂(工厂的作用是用于创建具体的解析器)
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance() ;
// 获得具体的 DOM 解析器
DocumentBuilder db = dbf.newDocumentBuilder() ;
// 解析一个 xml 文档,获得 Docuement 对象(根节点)---这个相当于拿到了进入 XML 文档的入口。这里 XML 文档是相对路径
Document doc = db.parse(new File("student.xml")) ;
//获得根元素节点 ----> <学生名册>
Element rootEle = doc.getDocumentElement();
// 这个头部信息与递归没有用
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");
//调用递归方法
parseElement(rootEle) ;
}
//递归解析
private static void parseElement(Element ele) {
//获得元素(标签)的名字
String tagName = ele.getNodeName() ;
//获得 ele (参数)下面的所有的孩子构成的一个 Node 列表
NodeList children = ele.getChildNodes() ;
//到这里解析可得到 ---> <学生 ——下一步是要解析这个元素有没有属性
System.out.print("<" + tagName);
//获得 ele (参数)元素的所有属性所构成的 NamedNodeMap 对象,需要对其进行判断
NamedNodeMap map = ele.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(" " + attrName + "='" + attrValue + "'");
}
}
//到这里拼接成了---> <学生 学号="1">
System.out.print(">");
//这个时候开始遍历 children 的 "孩子"
for(int i = 0 ; i < children.getLength(); i ++) {
//这是拿到了 第 i 个孩子
Node node = children.item(i) ;
//获得节点的类型
short nodeType = node.getNodeType() ;
/**
* 下面的判断是必须
* 这里为什么要判断一下节点的类型呢?
* 因为在 DOM 解析 XML文档的时候, W3C将 元素、节点、文本(包括空格)、属性、注释等都当成了节点!
* 我们这里拿到了一个 "节点" 但是 对应到 XML 文档里却不知道具体是什么类型的了!所以在这里要首先判断一下节点的类型
*/
if(nodeType == Node.ELEMENT_NODE) {
/**
* 如果这里出现了类似 <学生 学号="1"> 的这种情况,应该调用刚才解析 <学生 学号="1"> 的方法
*/
// 因为进入到这个判断里面了,所以可以肯定的认为这个节点是一个 Element 所以可以进行一下强制转换
// 又因为这个是元素,所以继续递归。
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("-->");
}
}
// 关闭这个节点(指--> <学生 学号="1">) , 这里打印的是 --> </学生>
System.out.print("</" + tagName + ">");
//到此这个遍历就结束了!
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<学生名册>
<学生 学号="1">
<姓名>张三</姓名>
<!-- haha -->
<性别>男</性别>
<年龄>20</年龄>
</学生>
<学生 学号="2">
<姓名>李四</姓名>
<性别>女</性别>
<年龄>19</年龄>
</学生>
<学生 学号="3">
<姓名>王五</姓名>
<性别>男</性别>
<年龄>21</年龄>
</学生>
</学生名册>
分享到:
相关推荐
目标是获取一个包含预定义 XML 文件的目录,并递归浏览它,使用 Java 编程语言根据其标题和内容处理每个文件。 进行的治疗是: 按照说明和预期的输出文件,将大的“.txt”文件切成 2 个 XML 文件。 通过删除给定的...
一个快速灵活的开源 XML 验证器,能够根据 XML 文档中定义的 XML 模式或强制另一个模式目标对 XML 文档执行批量验证。 XmlValidate通过文件名或 URL 或使用目标文件扩展名列表递归搜索目录来验证单个 XML 文档。 第...
给定以下XML结构文件(files.xml): <FileSystem> < DriverC > ”MSDOS622”> ” Command.com” ></File> </Dir> ”MSDOS.SYS” ></File> ” IO.SYS” ></File> </DriverC> < DriverD > …… </DriverD>...
《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识到高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...
1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。...47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可...
python解压递归地取消归档,解压缩和展平给定目录中的所有文件迈克·詹森<gmail> 根据PSF许可分发: : 最初是为VAVE xml提要析构函数( )写的需要Python rarfile( ),python-magic( )和python-filetype( )...
静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个EXE/DLL中的支持库,该支持库中的数据或资源将不能再被其它EXE/DLL中所使用的同名支持库访问。这是因为代码被分别...
usb.util : 这个包提供了一些有用的实用程序,可以将 firmware下载到 USB 设备上、将 USB 系统的内容转储到 XML 中、以及将只有 bulk I/O 的 USB 设备工具转换成一个套接字(socket)。 usb.devices : 这个可选包收集...
需要检查一组文件是否存在给定的字符串。 源文件包含在ZIP文件中,该文件可以递归包含ZIP文件 用 java -jar findString.jar -d directory -s strings [-o output] -d,-dir目录,包含所有zip文件 -s,-stringfile带...
输出既打印在控制台上,又打印到文件sitemap.xml中。 在控制台中,您可以看到的例外 思考过程 思想过程很简单 使用Jsoup获取具有属性的每个元素,该属性包含给定页面的URL 对获得的每个URL递归执行此操作,仅对以...
一个小型工具,用于在IntelliJ IDEA的安装中搜索动作XML文件,并提取可在插件中使用的动作ID列表。结构体ProcessActionsXml有Java代码,可扫描给定文件夹中的IntelliJ操作ID。 结果数据以CSV文件存储在docs / _data ...
对于每个识别的 jar 文件,它将打印出一个 XML 片段,您可以将其包含在 pom.xml 的依赖项部分中 未找到的工件将单独打印并作为 pom 中的本地库引用。 建造: 在 pom.xml 所在的目录中,运行: mvn package 然后...
从给定的 Matlab 结构开始,Struct2MindMap 递归地遍历结构的所有级别并构建思维导图。 思维导图存储为基于 FreeMind ( http://freemind.sourceforge.net/wiki/index.php/Main_Page ) 的 xml 文件,并且还与 XMind ...
短绒棉有用于验证Lua和XML文件的脚本: scripts/validate-lua < directory>scripts/validate-xml < directory> 这些脚本将递归地遍历给定目录,以查找要验证的文件,如果失败,则退出非零状态。 他们每次推动都会...
3.1.6 使用FORXML子句输出XML 3.1.7 通过OPTION子句利用提示 3.1.8 DISTINCT和ALL谓词 3.2 使用INSERT语句添加数据 3.2.1 多行插入 3.2.2 INSERTINTOSELECT语句 3.3 用UPDATE语句更改数据 3.4 DELETE语句 3.5 本章小...
3.1.6 使用FORXML子句输出XML 3.1.7 通过OPTION子句利用提示 3.1.8 DISTINCT和ALL谓词 3.2 使用INSERT语句添加数据 3.2.1 多行插入 3.2.2 INSERTINTOSELECT语句 3.3 用UPDATE语句更改数据 3.4 DELETE语句 3.5 本章小...