org.w3c.dom(java dom)操作XML文档

本文介绍了使用org.w3c.dom解析XML的方式,通过DocumentBuilderFactory和DocumentBuilder创建DOM对象,解析XML文件。讨论了DOM解析的优点和缺点,并列举了常用的DOM对象如Document、Node、Element和Attr。同时给出了XML文档的解析和创建示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 简介

XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析

本文介绍使用org.w3c.dom解析XML

简单来说:就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述。

优点:

  1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。

  2、解析过程中,树结构保存在内存中,方便修改。

缺点:

  1、由于文件是一次性读取,所以对内存的耗费比较大。

  2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

首先介绍下Java DOM 的 API:

1.解析器工厂类:DocumentBuilderFactory

创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2.解析器:DocumentBuilder

创建方法:通过解析器工厂类来获得 DocumentBuilder db = dbf.newDocumentBuilder();

3.文档树模型Document

创建方法:a.通过xml文档 

                        Document doc = db.parse("bean.xml");  

                   b.将需要解析的xml文档转化为输入流

                       InputStream is = new FileInputStream("bean.xml");

                       Document doc = db.parse(is); 

然后介绍下常用对象:

1.Document对象

代表了一个XML文档的模型树,所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,直接在这个Document对象上进行操作即可;

包含了很多getXXX(),setXX(),createXX()。

2.Node对象

是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等

3.元素类Element

是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法

4.属性类Attr

代表某个元素的属性,虽然Attr继承自Node接口,但因为Attr是包含在Element中的,但并不能将其看做是Element的子对象,因为Attr并不是DOM树的一部分

由于解析最常用,先写个解析的实例:

解析实例:

package com.zc.test;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

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

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException;

public class XmlTest {
	 
	@Test
	public void resolveStringXml() throws ParserConfigurationException, SAXException, IOException {
		String soap = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
					+ "<persons>"
						+ "<person id=\"001\">"
							+ "<name>张三</name>"
							+ "<age>20</age>"
						+ "</person>"
						+ "<person id=\"002\">"
							+ "<name>李四</name>"
							+ "<age>30</age>"
						+ "</person>"
					+ "</persons>";
		 
		//读取并转换String
		Reader rr=new StringReader(soap);
		//创建解析工厂DocumentBuilderFactory
		DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
		//指定DocumentBuilder实例
		DocumentBuilder domBuilder=builderFactory.newDocumentBuilder();
		//创建Document对象
		Document document=domBuilder.parse(new InputSource(rr));
		 
		//获取文档的根节点
		NodeList roots = document.getChildNodes();
		Node root = roots.item(0);
		//获取文档根节点的第二种方式
		//Element documentElement = document.getDocumentElement();
		
		//根节点的标签名为persons
		if (root != null && root.getNodeName().equals("persons")){ 
		   //获取persons下所有节点,返回结果为数组
		   NodeList persons = root.getChildNodes();
			
		   //遍历数组
		   for (int i = 0; i < persons.getLength(); i++) {
			   //获取person节点
			   Node person = persons.item(i);
			   if (person.getNodeName().equals("person")){
				   //获取属性id的值
				   String id = person.getAttributes().getNamedItem("id").getNodeValue();
				
				   //获取person节点下的所有节点
				   NodeList nodes = person.getChildNodes();
				   
				   for (int j = 0; j < nodes.getLength(); j++) {
					   //获取第一个标签
					   Element node = (Element)nodes.item(j);
					   
					   //判断是不是name标签
					   if (node.getNodeName().equals("name")){ 
						   String name =  node.getFirstChild().getNodeValue();
					   };
					   
					   if (node.getNodeName().equals("age")){ 
						   String age = node.getFirstChild().getNodeValue();
					   }
				 }
			  }
		   }
		}
	}

	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		XmlTest xmlTest = new XmlTest();
		xmlTest.resolveStringXml();
	}

}

创建xml文档并保存:

创建xml文档的方法如下:

   //创建一个Document,用于存储成xml
	  public static Document creat_xml()
	  {
	        //为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder 
	        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	        DocumentBuilder db = null;
	        try {
	            db = dbf.newDocumentBuilder();
	            Document doc = db.newDocument();

	            //下面是建立XML文档内容的过程,先建立根元素
	            Element root = doc.createElement("花名册");
	            //根元素添加到文档 
	            doc.appendChild(root);

	            //建立子元素
	            for (int i = 0; i < 10; i++) {
	                //建立一级子元素,添加到根元素 
	                Element student = doc.createElement("学生");
	                
	                //为一级子元素设置属性
	                student.setAttribute("性别", "男");
	                root.appendChild(student);
	                
	                //为一级子元素添加文本
	                Text tName = doc.createTextNode("学生"+i);
	                student.appendChild(tName);
	            }
	            return doc;

	        } catch (Exception err) {
	            err.printStackTrace();
	            System.exit(1);
	        }
	        return null;
	  }

保存需要一个额外的jar包,可在这里下载:https://blog.youkuaiyun.com/luanpeng825485697/article/details/78164344

	  //将Document保存成xml文件
	  public static void save_xml(Document doc,String filepath) {
		  FileOutputStream outStream = null;
		  OutputStreamWriter outWriter = null;
	      try {
	            //把XML文档输出到指定的文件
	    	    //先将Document强转成XmlDocument
	            org.apache.crimson.tree.XmlDocument xmlDoc = (org.apache.crimson.tree.XmlDocument)doc;
	            
	            //输出到指定路径下
	            outStream = new FileOutputStream(filepath);
	            outWriter = new OutputStreamWriter(outStream);
	            xmlDoc.write(outWriter, "UTF-8");
	        } catch (Exception e) {
	            e.printStackTrace();
	        }finally{
	        	try {
	        		outWriter.close();
	        	} catch (IOException e) {
	        		e.printStackTrace();
	        	}
	        	try {
	        		outStream.close();
	        	} catch (IOException e) {
	        		e.printStackTrace();
	        	}
	        }
	  }

 

 

本文参考了以下几篇博客,复制了很多原博客内容。只为学习,侵删。

https://blog.youkuaiyun.com/liweigov/article/details/6628071#commentsedit

http://www.cnblogs.com/shenliang123/archive/2012/05/11/2495252.html

https://blog.youkuaiyun.com/luanpeng825485697/article/details/78164344

https://blog.youkuaiyun.com/RickyIT/article/details/53813246

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值