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

来源:互联网 发布:php短网址源码 编辑:程序博客网 时间:2024/06/06 00:05

一: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 +">");

   }

}

 

原创粉丝点击