XML---使用DOM解析(实例)

public class Student {
	
	private String id;
	private String name;
	private Integer age;
	private Double score;

}
/**
 * 功能:解析students.xml 
 * 技能:使用DOM技术
 * 
 * 认识DOM 1.基本思路:将整个文档在内存中形成一棵倒挂的树,每个节点Node都是一个对象
 * 
 * 2.常用类 Node:抽象节点 Element: student name age score Attr : id Text : 李明 89 23
 * 
 * 3.缺点
 * 	1.繁琐:前面三个步骤相同,也需要书写一遍。能否封装好
 *  2.繁琐:getChildNodes()不仅包括Element----1,也包括空白形成的Text---3,遍历时需要进行筛选
 *  3.繁琐:getChildNodes()也包括注释、也包括外部DTD引用,大部分情况下并不是用户需要的
 *  解决:DOM4J
 *  
 * 4. 如果文本中出现了特殊字符,必如<,& \,怎么处理
 * 		方法1:字符实体 <  >
 * 		方法2:只显示不解析  <23  CDATA = Char Data
 * 	 
 * 
 */

import java.io.IOException;

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;
import org.xml.sax.SAXException;
public class TestDOM {

	public static void main(String[] args) throws ParserConfigurationException,
			SAXException, IOException {
		// 1.创建DOM解析器工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

		// 2.由DOM解析器工厂创建DOM解析器
		DocumentBuilder db = dbf.newDocumentBuilder();

		// 3.由DOM解析器解析文档,生成DOM树
		Document doc = db.parse("students.xml");

		// 4.解析DOM树,获取文档内容(元素 属性 文本)
		// 4.1获取根元素students
		NodeList studentsList = doc.getElementsByTagName("students");
		// NodeList studentsList = doc.getChildNodes();
		// System.out.println(studentsList.getLength());
		Node studentsNode = studentsList.item(0);// students根节点
		// 4.2获取students中所有的子元素student
		NodeList studentList = studentsNode.getChildNodes();
		// System.out.println(studentList.getLength());//空白也算节点
		// 4.3对每个student进行处理
		for (int i = 0; i < studentList.getLength(); i++) {
			// 获取第i个节点
			Node studentNode = studentList.item(i);
			// System.out.println(studentNode.getNodeType());
			if (studentNode.getNodeType() == Node.ELEMENT_NODE) {// Node.ELEMENT_NODE
																	// :1
				// 获取每个学生的id属性及其值
				Element stuElem = (Element) studentNode;
				String value = stuElem.getAttribute("id");
				System.out.println("id----->" + value);
				// 获取每个学生的name,age,score
				NodeList nasList = stuElem.getChildNodes();
				// System.out.println(nasList.getLength());
				for (int j = 0; j < nasList.getLength(); j++) { // 7
					// 获取第j个节点
					Node nasNode = nasList.item(j);
					// 只处理Element,不处理空白
					if (nasNode.getNodeType() == Node.ELEMENT_NODE) {// 3
						// 得到元素节点
						Element nasElem = (Element) nasNode;
						// 获取元素名称
						String name = nasElem.getNodeName();
						// 获取元素的文本
						String content = nasElem.getTextContent();
						// 输出元素的名称和文本
						System.out.println(name + "----" + content);

					}
				}
				System.out.println();
			}
		}

	}

}

import java.io.IOException;

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;
import org.xml.sax.SAXException;

public class TestDom2 {
	
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		//1:创建DOM解析器工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 2.由DOM解析器工厂创建DOM解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		// 3.由DOM解析器解析文档,生成DOM树
		Document doc = db.parse("students.xml");
		//4:获取文档结构的根节点
		NodeList rootList = doc.getElementsByTagName("students");
		//5:获取根节点
		Node students = rootList.item(0);
		//6:获取根节点的子节点
		NodeList childNodes = students.getChildNodes();
		//7:遍历子节点
		for(int i=0;i<childNodes.getLength();i++){
			//注意:dom解析会把空白节点,也会算在子节点中
			Node student = childNodes.item(i);
			
		
			//可以获取每一个节点的类型
			//1:标签节点  2:文本节点  3:属性节点
			if(student.getNodeType()==Node.ELEMENT_NODE){
				//8:将Node这个类型需要组一个强制类型转换 Element
				Element el = (Element)student;
				//获取el节点的子节点以及属性
				String id = el.getAttribute("id");
				System.out.println(id);
				NodeList childNodes2 = el.getChildNodes();
				for(int j=0;j<childNodes2.getLength();j++){
					Node item = childNodes2.item(j);
					if(item.getNodeType()==Node.ELEMENT_NODE){
						Element el2 = (Element)item;
						//获取每个子节点的内容值
						String name = el2.getNodeName();//获取标签名
						String value = el2.getTextContent();//获取内容值
						System.out.println(name+":"+value);
					}
					
				}
				
				System.out.println("-------------------");
				
			}
		}
	}

}

猜你喜欢

转载自blog.csdn.net/qq_41532872/article/details/86748635