心得5--XML编程(CRUD)--dom、sax解析案例分析
一: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 +">");
}
}