XML解析--使用Dom


一、使用DOM解析XML介绍

DOM解析器在解析XML文档时,先读取整个XML文档,再在内存中架构整个Dom树的Document对象。会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

优点:把XML文件在内存中构造成树形结构,可以遍历和修改节点

缺点:如果文件比较大,内存会有压力,解析的实际时间会比较长。

二、使用Dom解析XML的步骤

(1)反射一个解析工厂对象

	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

(2)创建Dom解析器对象

	DocumentBuilder builder = dbf.newDocumentBuilder();

(3)获得Document文档对象

	Document doc = builder.parse("src/com/demo.xml");//此处填写需要解析的XML的路径

总结一下就是:先反射一个解析工厂对象,再通过这个解析工厂对象创建一个Dom解析器对象,再通过Dom解析器对象获得doc文档对象。

三、Dom解析XML实例

(1)给出需要解析的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<employees>
	<employee id="0">
		<name>Alexia</name>
		<age>23</age>
		<sex>Female</sex>
		<weight>150</weight>
		<weight><a>160</a></weight>
	</employee>
	<employee id="1">
		<name height="178">Edward</name>
		<age>24</age>
		<sex>Male</sex>
	</employee>
	<employee id="2">
		<name>wjm</name>
		<age>23</age>
		<sex>Female</sex>
	</employee>
	<employee id="3">
		<name>wh</name>
		<age>24</age>
		<sex>Male</sex>
	</employee>
</employees>

(2)使用Dom对XML进行解析

package com.test;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * 类说明:
 * 		使用Dom解析XML
 * Dom解析XML的步骤:
 * 		1.创建一个dbf工厂对象的对象.
 * 		2.通过dbf工厂对象创建一个dom解析器DocumentBuilder对象.
 * 		3.通过DocumentBuilder对象的parse(String fileName)方法解析xml文件.
 * 
 * @author qianliangguo
 */
public class DomXML {
	public static void main(String[] args) throws Exception {
		//1.创建[dbf工厂对象]
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			//设置解析器忽略注释和空格a 
			dbf.setIgnoringComments(true);
			dbf.setIgnoringElementContentWhitespace(true);
		//2.通过dbf工厂对象获得[Dom解析器对象]
		DocumentBuilder builder = dbf.newDocumentBuilder();
		//3.调用Dom解析器对象解析XML文档,获得[文档Document对象]
		Document doc = builder.parse("src/com/demo.xml");//此处填写需要解析的XML的路径
		
		//--获得根节点
		Element root = doc.getDocumentElement();
			System.out.println(root.getTagName());//获得节点名字
		
		//--根据标签名获得节点集合
		NodeList nodeList = doc.getElementsByTagName("employee");
			System.out.println("employee节点个数:"+nodeList.getLength());
			
			//遍历结点集合
			for(int i=0;i<nodeList.getLength();i++){
				Element element = (Element)nodeList.item(i);
				//获得id属性值
				String attribute = element.getAttribute("id");
				System.out.println("id:"+attribute);
			}
			
			//获得第一个节点下的属性
			Element element = (Element)nodeList.item(0);
			String nameValue = element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
			String ageValue = element.getElementsByTagName("age").item(0).getFirstChild().getNodeValue();
			String sexValue = element.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue();
			String weightValue = element.getElementsByTagName("weight").item(1).getFirstChild().getFirstChild().getNodeValue();
			System.out.println("第一个节点的name文本值:"+nameValue);
			System.out.println("第一个节点的age文本值:"+ageValue);
			System.out.println("第一个节点的sex文本值:"+sexValue);
			System.out.println("第一个节点的第二个weight文本值:"+weightValue);
			
			//获得第二个节点下的属性
			Element element2 = (Element)nodeList.item(1);
			String nameValue2 = element2.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
			String ageValue2 = element2.getElementsByTagName("age").item(0).getFirstChild().getNodeValue();
			String sexValue2 = element2.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue();
			System.out.println("第二个节点的name文本值:"+nameValue2);
			System.out.println("第二个节点的age文本值:"+ageValue2);
			System.out.println("第二个节点的sex文本值:"+sexValue2);
	}
}

解析效果:
在这里插入图片描述

发布了332 篇原创文章 · 获赞 871 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/103985944