XML解析技术初探(一):DOM解析

xml解析技术分为两种:民间的 和 官方的。

民间的就是鼎鼎有名的SAX(Simple API for XML),是 XML 社区提供的标准,几乎所有的 XML 解析器都支持它。

官方的自然是权威机构W3C组织出台的DOM(Document ObjectModel)了,今天先初探下官方的技术。

根据W3C DOM规范,DOM是HTMLXML的应用编程接口(API),

DOM将整个页面映射为一个由层次节点组成的文件。 

利用DOM解析xml就是找到节点,获取节点属性等等。有点类似于查找数据库的某条记录,从而获取某个记录的字段值。

而xml也经常用于存储数据,于是乎,咱们可以按照操作数据库对象的CRUD方式来操作xml文档:

<暂且利用j2se的JAXP(JavaAPIforXMLProcessing)对xml解析>

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class OperateXML {
	
		private Document document;
		private String xmlPath;
		/**
		 * 获取xml文档,类似于 数据库建立连接
		 * @param xmlPath xml文件的路径
		 * */
		public void getXML(String xmlPath){
			this.xmlPath = xmlPath;
			//1、创建工厂
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			//2、得到DOM解析器
			try {
				DocumentBuilder builder = factory.newDocumentBuilder();
				//3、解析xml文档,得到代表文档的document
				document = builder.parse(xmlPath);
				System.out.println("xml文档已经获取");
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}  catch (IOException e) {
				e.printStackTrace();
			} catch (SAXException e) {
				e.printStackTrace();
			}
		}
		
		/**
		 * 获取元素节点集合,类似于 数据库中具体某张表
		 * @param tagName:节点名,如:<book id="1" name="java"></book>中tagName="book";
		 * @return NodeList:节点集合,此处返回节点名称同为tagName的集合
		 * */
		public NodeList getNodelist(String tagName){
			return document.getElementsByTagName(tagName);
		}
		
		/**
		 * 获取元素节点,类似于 数据库中具体某张表的某条记录
		 * @param attrName:表示属性名,类似于数据库字段名
		 * @param attrValue:表示属性值,类似于数据库字段值
		 * @param nodelist:节点集合
		 * @return Element:表示 XML 文档中的一个元素节点
		 * */
		public Element getElt(String attrName, String attrValue,NodeList nodelist){
			Element elt = null;
			for(int i=0; i<nodelist.getLength(); i++)
			{
				elt = (Element)nodelist.item(i);//Element实现了node接口,可以强转
				if(elt.getAttribute(attrName).equals(attrValue))
					break;
				else
					continue;
			}
			return elt;
		}
		
		/**
		 * 获取节点元素的属性,类似于查找表中某条记录的字段值
		 * @param elt:元素节点
		 * @param attrName:所要查找的属性名
		 * @return String属性值
		 * */
		public String getAttribute(Element elt,String attrName){
			return elt.getAttribute(attrName);
		}
		
		/**
		 * 修改节点属性值,类似于更新数据库字段值
		 * @param attrName:表示属性名,类似于数据库字段名
		 * @param attrValue:表示属性值,类似于数据库字段值
		 * @param elt:待修改属性的节点
		 * */
		public void modifyElt(String attrName, String attrValue,Element elt){
			elt.setAttribute(attrName, attrValue);
			//更新了内存中节点,需将内存中信息写回xml文档
			toXmlFile();
		}
		
		/**
		 * 从xml中移除节点,类似于删除某条数据表记录
		 * @param elt:待删除的节点
		 * @param superElt:父节点
		 * */
		public void removeElt(Element elt,Element superElt){
			superElt.removeChild(elt);
			toXmlFile();
		}	
		
		/**
		 * 新增一个节点,类似于数据表中新增一条记录
		 * @param tagName:表示节点名,类似于数据表
		 * @param attrNameArr:节点的属性名数组
		 * @param attrValueArr:节点的属性值数组,须跟attrNameArr的数组一一对应
		 * @param superElt:表示要往哪个节点中添加子节点,可以理解为往数据库添加表
		 * */
		public void addElt(String tagName, String[] attrNameArr, String[] attrValueArr, Element superElt){
			//创建一个节点
			Element elt = document.createElement(tagName);
			//给节点赋予各种属性
			for(int i=0; i<attrNameArr.length; i++)
				elt.setAttribute(attrNameArr[i], attrValueArr[i]);//属性的初始值设置为空
			superElt.appendChild(elt);
			//更新了内存中节点,需将内存中信息写回xml文档
			toXmlFile();
		}
		
			
		
		/***
		 * 将更新的内存写回到xml文档
		 */
		private void toXmlFile(){
			try {
				TransformerFactory tffactory = TransformerFactory.newInstance();
				Transformer tf;
				tf = tffactory.newTransformer();
				tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream(xmlPath)));
			} catch (TransformerConfigurationException e) {
				e.printStackTrace();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (TransformerException e) {
				e.printStackTrace();
			}
		}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值