您的位置:首页 > 其它

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

2013-12-17 17:55 169 查看
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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: