`

使用递归解析任意给定的一个xml文档并且将其内容输出到命令行上(三)--其中的递归方法重点

XML 
阅读更多
<?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-dom4j解析工具类

    比如,如果我们有一个XML文档,其中包含多个具有相同标签名的元素,这个方法可以用来收集所有这些元素。这在处理列表或集合数据时非常有用,例如,解析一个包含多条记录的XML数据源。 在实际应用中,这样的工具类...

    js使用递归解析xml

    总结一下,JavaScript使用递归解析XML是一种高效且灵活的方法,尤其适用于处理具有层次结构的数据。在这个例子中,递归函数`Traversal`逐层解析XML结构,构建了一个易于理解和操作的JavaScript对象模型。通过递归,...

    C#递归读取XML菜单数据的方法

    给定的XML文件代表了一个应用程序的菜单系统,其中包含多个应用(Applications),每个应用有多个模块(Modules),每个模块又包含多个菜单(Menus)。每个菜单元素有自己的ID、文本、URL等属性,这使得它非常适合...

    简单递归.txt

    从给定的文件信息来看,虽然标题和描述中提到了“简单递归”,但提供的代码片段实际上并未直接展示递归的使用,而是展现了如何解析XML文档并将数据加载到一个映射(数据库模拟)中的过程。然而,这并不妨碍我们深入...

    解析多节点XML文件

    使用DOM解析器,如Java的`javax.xml.parsers.DocumentBuilderFactory`,可以创建一个`Document`对象,该对象代表整个XML文档。通过`getElementsByTagName`等方法,我们可以获取到特定标签的元素集合,然后递归遍历...

    JS xml转json

    例如,在编辑器中,可能会需要将用户输入的XML格式内容转换为JSON格式进行存储或发送到服务器。 #### 三、关键函数分析 根据给定的内容,我们可以分析出几个关键函数: 1. **`loadXML(xmlString)`**: - **功能*...

    使用C++封装tinyxml,读取xml文件

    在`loadConfig`方法中,我们将使用TinyXML来加载XML文件并解析其内容: ```cpp bool XmlConfigManager::loadConfig(const std::string& filePath) { if (!doc.LoadFile(filePath)) { std::cerr ...

    XML-Java-Parser:一个 Java 程序,它接受一个目录并递归地解析 XML 文件以生成更小、更易读的文件,遵循某些限制

    目标是获取一个包含预定义 XML 文件的目录,并递归浏览它,使用 Java 编程语言根据其标题和内容处理每个文件。 进行的治疗是: 按照说明和预期的输出文件,将大的“.txt”文件切成 2 个 XML 文件。 通过删除给定的...

    XML应用开发(软件品牌)-1期 6.1 课堂实践-DOM树结构.doc

    DOM树结构是解析XML文档的核心概念,它将XML文档视为一个由节点组成的树。在DOM中,每个XML元素、属性、文本、注释等都有对应的节点类型。下面我们将详细探讨DOM树的构建以及如何根据给定的`Client.xml`文档绘制DOM...

    ios开发中的XML解析

    在iOS开发中,XML解析是一项重要的任务,尤其在处理结构化数据时。XML(Extensible Markup Language)是一种标记语言,用于存储和传输数据,它的结构清晰、可读性强,广泛应用于网络服务、配置文件和数据交换等领域...

    XmlValidate:一个快速灵活的基于 XML Java 的验证器,能够根据 XML 文档中定义的 XML 模式执行 XML 文档的批量验证或强制另一个模式目标

    一个快速灵活的开源 XML 验证器,能够根据 XML 文档中定义的 XML 模式或强制另一个模式目标对 XML 文档执行批量验证。 XmlValidate通过文件名或 URL 或使用目标文件扩展名列表递归搜索目录来验证单个 XML 文档。 第...

    Xml.zip_visual c_xml

    描述提到“解析一个XML文件,并打印XML文件里面的内容”,这意味着项目包含了一个程序,该程序能够读取XML文件,解析其结构,并将数据打印出来。XML文件的结构由一系列元素组成,每个元素可能包含属性和子元素。解析...

    ASP.net 递归读出网站上所有目录文件(源)

    在给定的标题“ASP.net 递归读出网站上所有目录文件(源)”中,主要涉及到的技术点是使用递归算法来遍历并读取网站目录下的所有文件。下面我们将详细探讨这一主题。 递归是一种解决问题的方法,它将问题分解为更小的...

    vb.net读取XML.rar

    要在XML文档中插入新节点,可以使用`CreateElement`方法创建新的`XmlElement`,然后使用`AppendChild`或`InsertBefore`等方法将其添加到现有节点的子节点列表中。例如,插入一个新的元素: ```vbnet Dim newNode ...

    PHP 的Array2xml

    2. **数组到XML的转换**:在`build()`方法中,首先会创建XML文档的根节点,然后递归地处理数组的每个元素。如果元素是数组,那么将其转换为XML元素并添加到当前元素下;如果元素是值,则作为文本内容添加到当前元素...

    TinyXML学习资料

    这个函数递归地遍历整个DOM树,并将每个节点的信息输出到标准输出流(STDOUT)。通过这种方式,开发者可以直观地查看DOM的层次结构和节点内容,这对于理解和调试非常有帮助。 ##### 用程序构建DOM 除了从文件加载...

    JS读取XML.txt

    在给定的代码片段中,我们看到的是一个XML文件的示例,以及一段用于解析该XML文件的JavaScript代码。下面将详细解释这段代码的主要知识点: ##### 1. 加载XML文档 ```javascript var xmlDoc; if (window....

    xml和实体对象相互转换 一步到位

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它以其结构化、可读性强的特点被广泛应用于软件开发、Web服务和数据交换等场景。实体对象(通常指的是Java中的对象或者类实例)是程序中的...

    泛型集合反射保存为xml文件 并可反射读取集合

    在.NET框架中,泛型、XML和反射是三个非常重要的概念,它们在处理数据和对象时发挥着关键作用。在给定的标题和描述中,我们看到这些技术被结合使用,实现了自定义类型集合的XML序列化和反序列化。 首先,让我们了解...

Global site tag (gtag.js) - Google Analytics