xml的解析方式——dom/sax、jdom、dom4j

最近學習了一些xml的解析方法,本來以爲面試時會被問到,現實是都沒有問。而是考了一些基礎的知識。我的媽啊,有些東西很久沒用就忘了。廢話不說,進入正題。

我知道的xml解析方式是目前比較公用的一些方式。有sun公司聲稱標準的jaxp(dom/sax)解析(但是自己在開發的時候是使用dom4j,不知道是什麼原因??????)、jdom、dom4j。根據一些民間的傳聞,這三種的解析效率是:dom4j>jdom>jaxp;本人經過學習也認爲dom4j最容易掌握。現在就幾種方式進行一些比較。我分別用dom、sax、jdom、dom4j來創建和讀取一個xml文件.如果是大蝦級以上的就不要看了,不要浪費時間了。哈哈哈。。。。。。。。。。

dom

使用dom來創建一個xml文檔。

package dom;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
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 java.io.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class DOM_CreateXML {

 /**
  *功能:
  * @param args
  * @throws ParserConfigurationException
  * @throws TransformerConfigurationException
  */
 public static void main(String[] args) throws ParserConfigurationException, TransformerConfigurationException {
  /**
   * 創建一個文檔構造器的工廠實例
   */
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  /**
   * 創建構造器實例
   *
   */
  DocumentBuilder builder = factory.newDocumentBuilder();
  
  /**
   * 創建存放節點的文檔對象
   *
   */
  Document doc=builder.newDocument();
  
  /**
   * 定義各個操作節點
   */
  //樹根
  Element tree_root=doc.createElement("tree_root");
  //樹枝
  Element tree_branch=doc.createElement("tree_branch");
  //樹葉
  Element tree_leave_01=doc.createElement("tree_leave_01");
  Element tree_leave_02=doc.createElement("tree_leave_02");
  //給第二個樹葉節點添加一個id屬性
  tree_leave_02.setAttribute("id", "first");
  /**
   * 添加節點的之間的內容
   *
   */
  tree_leave_01.setTextContent("第一片樹葉");
  
  tree_leave_02.setTextContent("第二片樹葉");
  
  
  /**
   * 向文檔中添加節點
   */
  tree_branch.appendChild(tree_leave_01);
  tree_branch.appendChild(tree_leave_02);
  tree_root.appendChild(tree_branch);
  doc.appendChild(tree_root);
  /**
   * 把這個xml文件輸出到指定的文件
   */
  //得到轉換的工廠實例
  TransformerFactory transFactory=TransformerFactory.newInstance();
  //得到轉換器
  Transformer former=transFactory.newTransformer();
  //設置轉換器的編碼
  former.setOutputProperty(OutputKeys.ENCODING,"GBK");
  
  //爲了使用former.transform(xmlSource, outputTarget)來轉換,需要獲得Source和Result兩個對象
  DOMSource source=new DOMSource(doc);
  
  Result result=new StreamResult(new File("d:"+File.separator+"tree.xml"));
  
  try {
   former.transform(source, result);
  } catch (TransformerException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }

}

使用domj解析方式產生的xml文件的格式是緊湊型的。我知道dom4j有格式的東西,不知道如何來格式話dom解析產生的文檔?這裏也請高手留言,提供一個方向。

 

用dom方式解析剛纔產生的文檔;

package dom;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.io.*;

public class DOM_ReadXML {

 /**
  *功能:
  * @param args
  * @throws ParserConfigurationException
  * @throws IOException
  * @throws SAXException
  */
 public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
  // TODO Auto-generated method stub
  /**
   * 得到解析工廠實例
   */
  DocumentBuilderFactory builderFactory= DocumentBuilderFactory.newInstance();
  /**
   * 得到解析器實例
   */
  DocumentBuilder builder=builderFactory.newDocumentBuilder();
  /**
   * 得到文本
   */
  Document doc=builder.parse(new File("d:"+File.separator+"tree.xml"));
  /**
   * 得到樹枝節點數組
   */
  NodeList tree_branchs=doc.getElementsByTagName("tree_branch");
  /**
   * 獲得第一個樹枝節點
   */
  Element tree_branch=(Element)tree_branchs.item(0);
  /**
   * 獲得該樹枝節點下的葉子節點
   */
  NodeList tree_leaves=tree_branch.getChildNodes();
  
  
  for(int i=0;i<tree_leaves.getLength();i++){
   //獲得節點名稱
   String name=tree_leaves.item(i).getNodeName();
   //獲得節點對應的文本
   String value=tree_leaves.item(i).getTextContent();
   //判斷該節點是否含有屬性
   if(tree_leaves.item(i).hasAttributes()){
   //獲得屬性的姓名,因爲dom解析就是把xml中的所有東西都當作節點看待,所以用getNodeName()方法來得到標籤屬性名感覺有點怪。
   String attributeName=tree_leaves.item(i).getAttributes().item(0).getNodeName();
   //通過屬性名來獲得屬性的值,這個時候要把Node類型轉換爲Element類型。因爲Node沒有getAttribute(String name)方法
   String attributeValue=(String)((Element) tree_leaves.item(i)).getAttribute(attributeName);
   System.out.println("<"+name+" "+attributeName+"="+attributeValue+">"+value+"<"+"
\\"+name+">");
   }
   else{
    System.out.println("<"+name+">"+value+"<"+"
\\"+name+">");
    
   }
  }
  
 }

}

sax 解析=解析器+事件處理器,下面是sax解析xml文檔的例子

package sax;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.HandlerBase;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderAdapter;

import java.io.*;

public class sax_01 {

 
 public static void main(String args[]) throws ParserConfigurationException, SAXException, Exception{
  
  /**
   * 獲得sax解析工廠實例
   */
  SAXParserFactory factory=SAXParserFactory.newInstance();
  /**
   * 通過工廠來獲得解析器
   */
  SAXParser parser=factory.newSAXParser();
  
  
  /**
   * 獲得讀取器
   */
  XMLReader reader=parser.getXMLReader();
  
  /**
   * 設置內容處理器
   */
  reader.setContentHandler(new MyHandler());
  
  /**
   * 讀取XML文件
   */
  reader.parse(new InputSource(new FileInputStream(new File("d:"+File.separator+"yangtao.xml"))));
  
 }
}
/**
 * 編寫事件處理器,當sax解析到xml文本的某一部分時,sax會自動地將該部分的一些數據傳給相應的方法
 *
 * @author Administrator
 *
 */
 class MyHandler extends XMLReaderAdapter{

 @Override
 public void characters(char[] ch, int start, int length)
   throws SAXException {
  // TODO Auto-generated method stub
  
  System.out.println(new String(ch,start,length).toString());
  super.characters(ch, start, length);
 }

 @Override
 public void endElement(String uri, String localName, String name)
   throws SAXException {
  // TODO Auto-generated method stub
  System.out.println("end-localName="+localName);
  System.out.println("end-Name="+name);
  super.endElement(uri, localName, name);
 }

 @Override
 public void startElement(String uri, String localName, String name,
   Attributes atts) throws SAXException {
  // TODO Auto-generated method stub
  System.out.println(uri);
  System.out.println("localName="+localName);
  System.out.println("name="+name);
  while("name".equals(name)){
   System.out.println(atts.getQName(0)+"--->"+atts.getValue(atts.getQName(0)));
   break;
  }
  super.startElement(uri, localName, name, atts);
 }

 public MyHandler() throws SAXException {
  super();
  // TODO Auto-generated constructor stub
 }
 
 
 
}

 


老婆要求加的鏈接>>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章