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

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

2012-10-11 15:33 417 查看
一: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 +">");
  
}
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: