您的位置:首页 > 其它

DOM解析XML

2015-06-30 21:54 204 查看
DOM的文档驱动

处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成 DOM树上的每个Node对象

优点是:可以对XML文档进行增删改查的复杂操作,可以随时按照节点间的关系访问数据

缺点:

受内存容量限制,不能处理大的文档,由于没有索引机制,处理效率较低

DOM(文档对象模型),为XML文档的解析定义了一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,然后代码就可以使用DOM接口来 操组整个树结构,其他点如下:

优点:整个文档树都在内存当中,便于操作;支持删除、修改、重新排列等多功能。

缺点:将整个文档调入内存(经常包含大量无用的节点),浪费时间和空间。

使用场合:一旦解析了文档还需要多次访问这些数据,而且资源比较充足(如内存、CPU等)。

为了解决DOM解析XML引起的这些问题,出现了SAX。SAX解析XML文档为事件驱动

package com.huang;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.Node;
import org.w3c.dom.NodeList;

//测试DOM在XML文件上的CURD操作
//在XML中换行和标签中的内容在遍历过程中若不加判断则会输出#text

public class DOM {

public static void main(String[] args) {

//获取抽象类的实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try{
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse("./src/data.xml");

//遍历XML表中的内容
list(document);

//查询XML表中第一个Student的姓名
//find(document);

//在XML表中插入一个学生的信息
//add(document);

//在XML表中修改属性和元素值
//update(document);

//在XML表中删除一个学生或者属性
//del(document);
}catch(Exception e){
e.printStackTrace();
}

}

// 遍历xml中所有元素
// 在XML中换行和标签中的内容在遍历过程中若不加判断则会输出#text
public static void list(Node node) {
if (node.getNodeType() == node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
NodeList nodelist = node.getChildNodes();

for (int t = 0; t < nodelist.getLength(); ++t) {
Node n = nodelist.item(t);
list(n);
}
return;
}

//在XML表中删除一个学生或者属性
public static void del(Document document) throws TransformerException{
Element node = (Element)document.getElementsByTagName("student").item(0);
//移除属性
node.removeAttribute("id");

//移除元素
Element name = (Element) node.getElementsByTagName("name").item(0);
node.removeChild(name);

//获得父亲结点
//Node parentnode = node.getParentNode();
//parentnode.removeChild(node);

//写入文件XML中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult("src/data.xml"));

}

//在XML表中修改一个学生的信息
public static void update(Document document){
try{
Element stuName = (Element) document.getElementsByTagName("name").item(0);
stuName.setTextContent("zhang");
stuName.setAttribute("小名", "zhangsan");

//写入文件XML中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult("src/data.xml"));
}catch(Exception e){
e.printStackTrace();
}
}

//在XML表中插入一个学生的信息
public static void add(Document document){
try{
Element stu = document.createElement("student");
//添加属性
stu.setAttribute("学生称号", "tiger");
Element name = document.createElement("name");
name.setTextContent("Ben");
Element studentid = document.createElement("studentid");
studentid.setTextContent("123321");
Element sex = document.createElement("sex");
sex.setTextContent("男");

stu.appendChild(name);
stu.appendChild(studentid);
stu.appendChild(sex);

//在根节点后面添加元素
document.getDocumentElement().appendChild(stu);

//写入文件XML中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult("src/data.xml"));
}catch(Exception e){
e.printStackTrace();
}

}

//查询XML表中第一个student的姓名
public static void find(Document document){
NodeList nodelist = document.getElementsByTagName("student");
//类型强制转换转换成子类Element类型
Element stu = (Element)nodelist.item(0);
//获得属性值
System.out.println("id : "+ stu.getAttribute("id"));
NodeList name = stu.getElementsByTagName("name");
Element firstname = (Element)name.item(0);
//获得元素值
System.out.println("name : " + firstname.getTextContent());
}

}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml dom