DOM 解析简单 xml 文档

java 中对 xml 文档的解析可以分为四种方式:DOM、JDOM、SAX、DOM4J。我们这儿用的是 DOM 的解析。

注意:创建document对象和element对象时候需要进行导包,这里导入的包应该是org.w3c.dom.Document和org.w3c.dom.Element,否则没有提供操纵XML的api,会报错。此demo 里需要导入的剩下的包都是 javax.xml 下的包。

首先:要有一个 xml 文档(在 eclipse 中新建一个 .xml 格式的文件,或者粘贴一个)

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book id="1">
		<name>懂得生活</name>
		<author>Mr Azzan</author>
		<year>2017</year>
		<price>100.00</price>
	</book>
	<book id="2">
		<name>热爱生活</name>
		<author>Miss Sun</author>
		<year>2017</year>
		<price>121.00</price>
	</book>
	<book id="3">
		<name>品味生活</name>
		<author>Miss Sun</author>
		<year>2016</year>
		<price>111.00</price>
	</book>
	<book id="4">
		<name>珍惜生活</name>
		<author>Miss Azzan</author>
		<year>2014</year>
		<price>100.00</price>
	</book>
</bookstore>

其次:编写解析代码

package com.test.xml;

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 DomDemo {
	/**
	 * 读取一个 xml 文档
	 */
	public static void test1() {
		// 创建一个工厂来创建流水线 创建一个构造器
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			// 通过创建一个工厂来创建流水线 创建一个构造器
			DocumentBuilder builder = factory.newDocumentBuilder();
			// 构造文档
			Document doc = builder.parse("books.xml");
			// 获取一个根元素
			Element root = doc.getDocumentElement();
			System.out.println("读取一个 xml 文档");
			// 获取一个元素节点名称
			System.out.println(root.getNodeName());
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取指定的元素集合 并且获取元素的属性信息
	 */
	public static void test2() {
		// 创建一个工厂来创建流水线 创建一个构造器
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			// 通过创建一个工厂来创建流水线 创建一个构造器
			DocumentBuilder builder = factory.newDocumentBuilder();
			// 构造文档
			Document doc = builder.parse("books.xml");
			// 根据元素名 标签名 来获取所有的元素 小知识 ===》 Ctry+q 回到当前的位置
			NodeList studentList = doc.getElementsByTagName("book"); // NodeList 是一个数组
			System.out.println("获取指定的元素集合 并且获取元素的属性信息");
			// studentList.getLength(); 数组元素的长度
			for (int i = 0; i < studentList.getLength(); i++) {
				// 遍历内容 出来一个具体的节点
				Node student = studentList.item(i);
				// 用 .getNodeName() 方法 ,获取 student 的名称
				System.out.print(student.getNodeName());
				System.out.print("===>");
				// 打印属性名
				System.out.print(student.getAttributes().item(0).getNodeName() + ",");
				// 打印属性名的信息值 node节点 item 逐条列出 Attributes 属性
				System.out.println(student.getAttributes().item(0).getNodeValue());
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取元素的子元素集合,并解析元素文本内容
	 */
	public static void test3() {
		// 创建一个工厂来创建流水线 创建一个构造器
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			// 通过创建一个工厂来创建流水线 创建一个构造器
			DocumentBuilder builder = factory.newDocumentBuilder();
			// 构造文档
			Document doc = builder.parse("books.xml");
			// 根据元素名 标签名 来获取所有的元素 小知识 ===》 Ctry+q 回到当前的位置
			NodeList studentList = doc.getElementsByTagName("book"); // NodeList 是一个数组
			System.out.println("获取元素的子元素集合,并解析元素文本内容");
			// studentList.getLength(); 数组元素的长度
			for (int i = 0; i < studentList.getLength(); i++) {
				// 遍历内容 出来一个具体的节点
				Node student = studentList.item(i);
				// 获取子元素信息
				NodeList nodeList = student.getChildNodes();
				for (int j = 0; j < nodeList.getLength(); j++) {
					Node node = nodeList.item(j);
					if ("name".equals(node.getNodeName()) || "author".equals(node.getNodeName())) {
						System.out.print(node.getNodeName() + "==>");
						System.out.println(node.getTextContent());
					}
					if ("year".equals(node.getNodeName()) || "price".equals(node.getNodeName())) {
						System.out.print(node.getNodeName() + "==>");
						System.out.println(node.getTextContent());
					}
				}
				System.out.println();
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println();
	}

	public static void main(String[] args) {
		test1();
		System.out.println();
		test2();
		System.out.println();
		test3();

	}

}

最后:解析结果如图

@Super_Sunleo

期待你的评论!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值