您的位置:首页 > 编程语言

心得5--XML编程(CRUD)--dom、sax解析案例分析

2012-10-11 15:33 519 查看
一:DOM解析XMl文档,运用DOM解析方法对XML文档增删改查,该技术要把XMl文档全部读取完存在内存中然后再解析,速度比较慢,而且当改文档内存过大时,会使内存溢出,系统崩溃

packagecom.dom;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjavax.xml.parsers.DocumentBuilder;

importjavax.xml.parsers.DocumentBuilderFactory;

importjavax.xml.parsers.ParserConfigurationException;

importjavax.xml.transform.Transformer;

importjavax.xml.transform.TransformerException;

importjavax.xml.transform.TransformerFactory;

importjavax.xml.transform.dom.DOMSource;

importjavax.xml.transform.stream.StreamResult;

importorg.junit.Test;

importorg.w3c.dom.Document;

importorg.w3c.dom.Element;

importorg.w3c.dom.Node;

importorg.w3c.dom.NodeList;

importorg.xml.sax.SAXException;

publicclass Demo2 {

@Test

//获取所有节点

public void readAll () throwsParserConfigurationException, SAXException, IOException{

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilder db =factory.newDocumentBuilder();

Document document = db.parse("src/book.xml");

Node root =document.getElementsByTagName("bookstore").item(0);

list(root);

}

//遍历元素

private void list(Node node) {

if(node instanceof Element){

System.out.println(node.getNodeName());

}

NodeList list = node.getChildNodes();

for(int i=0;i<list.getLength();i++){

list(list.item(i));

}

}

@Test

//读取属性的值

public void readAttribute () throwsParserConfigurationException, SAXException, IOException{

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilder db =factory.newDocumentBuilder();

Document document = db.parse("src/book.xml");

Element element = (Element)document.getElementsByTagName("bookname").item(0);//这里一定记住不能忘了写item()方法,该方法是为了获取第几个bookname节点

System.out.println(element.getAttribute("id"));

}

@Test

//添加节点(追加)

public void insert() throwsParserConfigurationException, SAXException, IOException, TransformerException{

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilder db = factory.newDocumentBuilder();

Document document = db.parse("src/book.xml");

//创建节点

Element create = (Element)document.createElement("出版社");

create.setTextContent("河软出版社");

//获取要追加到其后的节点

Element element = (Element)document.getElementsByTagName("book").item(0);

element.appendChild(create); //元素可以加到根节点外。内容一定要加到根几点里

//将document文档中的内容添加到xml文件中

TransformerFactory tff =TransformerFactory.newInstance();

Transformer tf = tff.newTransformer();

tf.transform(new DOMSource(document),newStreamResult(new FileOutputStream("src/book.xml")));

}

@Test

//指定位置添加节点

public void insert1() throwsParserConfigurationException, SAXException, IOException, TransformerException{

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilder db =factory.newDocumentBuilder();

Document document = db.parse("src/book.xml");

//获取参考节点

Element element = (Element)document.getElementsByTagName("price").item(1);

//创建节点元素

Element creater = (Element)document.createElement("出版社");

creater.setTextContent("河软出版社");

//获取要追加到其后的节点

Element e = (Element)document.getElementsByTagName("book").item(1);

e.insertBefore(creater, element);

//将document文档中的内容添加到xml文件中

TransformerFactory tff =TransformerFactory.newInstance();

Transformer tf = tff.newTransformer();

tf.transform(new DOMSource(document),newStreamResult(new FileOutputStream("src/book.xml")));

}

@Test

//删除某一元素节点

public void delete() throwsParserConfigurationException, SAXException, IOException, TransformerException{

DocumentBuilderFactoryfactory = DocumentBuilderFactory.newInstance();

DocumentBuilder db =factory.newDocumentBuilder();

Document document = db.parse("src/book.xml");

Element element = (Element)document.getElementsByTagName("出版社").item(1);

//获取父节点

Element e = (Element)document.getElementsByTagName("book").item(1);

e.removeChild(element); //只能移除子节点不能移除自己

//将document文档中的内容添加到xml文件中

TransformerFactory tff =TransformerFactory.newInstance();

Transformer tf = tff.newTransformer();

tf.transform(new DOMSource(document),newStreamResult(new FileOutputStream("src/book.xml")));

}

@Test

//删除整个子元素节点

public void delete1() throwsParserConfigurationException, SAXException, IOException, TransformerException{

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilder db =factory.newDocumentBuilder();

Document document = db.parse("src/book.xml");

Element element = (Element)document.getElementsByTagName("price").item(2);

element.getParentNode().getParentNode().removeChild(element.getParentNode());

TransformerFactory tff =TransformerFactory.newInstance();

Transformer tf = tff.newTransformer();

tf.transform(new DOMSource(document),newStreamResult(new FileOutputStream("src/book.xml")));

}

@Test

//修改节点

public void update() throwsParserConfigurationException, SAXException, IOException, TransformerException{

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilder db =factory.newDocumentBuilder();

Document document = db.parse("src/book.xml");

Element element = (Element)document.getElementsByTagName("price").item(0);

element.setTextContent("80元"); //设置值用该方法,不能用 element.setNodeValue()

TransformerFactory tff = TransformerFactory.newInstance();

Transformer tf = tff.newTransformer();

tf.transform(new DOMSource(document),newStreamResult(new FileOutputStream("src/book.xml")));

}

}

二:SAX解析文档,SAX只能查询文档,不能对XML文档增删改。但是它边读取边解析,速度快

package com.dom;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.DefaultHandler;

publicclass Demo3 {

publicstaticvoid main(String[] args)throws
ParserConfigurationException,

SAXException, IOException {

// 创建工厂类

SAXParserFactory spf = SAXParserFactory.newInstance();

// 创建SAX解析器

SAXParser sp = spf.newSAXParser();

// 获取读取器

XMLReader xr = sp.getXMLReader();

// 设置处理器

xr.setContentHandler(new BookContentHandler());

// 读取xml文件

xr.parse("src/book.xml");

}

}

//
自己写的这个处理器类一定要是默认或是公共的外部类,不能是内部类(因为要继承DefaultHandler类)也不能是私有的(访问不到)

class BookContentHandlerextends DefaultHandler {

@Override

publicvoid characters(char[] ch,int
start,int length)

throws SAXException {

System.out.println(new String(ch, start, length));

}

@Override

publicvoid endElement(String uri, String localName, String qName)

throws SAXException {

System.out.println("<" + qName +">");

}

@Override

publicvoid startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

System.out.println("<" + qName +">");

}

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