xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J)

 

xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J)

第一種:SAX解析

SAX處理機制:SAX是一種基於事件驅動的API。利用SAX解析XML文檔,牽涉到兩個部分:解析器和事件處理器。解析器負責讀取XML文檔,並向事件處理器發生事件,如元素開始和元素結束事件;而事件處理器則負責對事件做出響應,對傳遞的XML數據進行處理。

測試用的xml文件:db.xml

Xml代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

<?xml version="1.0" encoding="UTF-8"?>  
<!--<!DOCTYPE dbconfig SYSTEM "db.dtd">-->  
<dbconfig>  
 <db type="oracle">  
  <driver>oracle.jdbc.driver.OracleDriver</driver>  
  <url>jdbc:oracle:thin:@localhost:1521:oracle</url>  
  <user>scott</user>  
  <password>tiger</password>  
 </db>  
</dbconfig> 



 

<?xml version="1.0" encoding="UTF-8"?><!--<!DOCTYPE dbconfig SYSTEM "db.dtd">--><dbconfig> <db type="oracle"> <driver>oracle.jdbc.driver.OracleDriver</driver> <url>jdbc:oracle:thin:@localhost:1521:oracle</url> <user>scott</user> <password>tiger</password> </db></dbconfig>

DTD文件db.dtd

Xml代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

<!ELEMENT dbconfig (db+)>  
<!ELEMENT db (driver,url,user,password)>  
<!ELEMENT driver (#PCDATA)>  
<!ELEMENT url (#PCDATA)>  
<!ELEMENT user (#PCDATA)>  
<!ELEMENT password (#PCDATA)>  
<!ATTLIST db type CDATA #REQUIRED>  




<!ELEMENT dbconfig (db+)><!ELEMENT db (driver,url,user,password)><!ELEMENT driver (#PCDATA)><!ELEMENT url (#PCDATA)><!ELEMENT user (#PCDATA)><!ELEMENT password (#PCDATA)><!ATTLIST db type CDATA #REQUIRED>

SAX解析實例一

org.xml.sax.DefalutHandler類:  可以擴展該類,給出自己的解析實現

SAXPrinter.java

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

import java.io.File;   
  
import javax.xml.parsers.SAXParser;   
import javax.xml.parsers.SAXParserFactory;   
  
import org.xml.sax.Attributes;   
import org.xml.sax.SAXException;   
import org.xml.sax.helpers.DefaultHandler;   
  
public class SAXPrinter extends DefaultHandler   
{   
  
  /** *//**  
   * 文檔開始事件  
   */  
    public void startDocument() throws SAXException   
    {   
        System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");   
    }   
       
  /** *//**  
   * 接收處理指令事件  
   */  
    public void processingInstruction(String target, String data) throws SAXException   
    {   
        System.out.println("<?"+target+" "+data+"?>");   
    }   
       
  /** *//**  
   * 元素開始事件  
   * 參數說明:  
   *   uri - 名稱空間 URI,如果元素沒有任何名稱空間 URI,或者沒有正在執行名稱空間處理,則爲空字符串。  
   *   localName - 本地名稱(不帶前綴),如果沒有正在執行名稱空間處理,則爲空字符串。  
   *   qName - 限定的名稱(帶有前綴),如果限定的名稱不可用,則爲空字符串。  
   *   attributes - 附加到元素的屬性。如果沒有屬性,則它將是空的 Attributes 對象。  
   */  
    public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException   
    {   
        System.out.print("<"+qName);//輸出元素名稱   
        int len=attrs.getLength();//元素屬性列表長度   
           
    //利用循環輸出屬性列表   
        for(int i=0;i<len;i++)   
        {   
            System.out.print(" ");   
            System.out.print(attrs.getQName(i));   
            System.out.print("=\"");   
            System.out.print(attrs.getValue(i));   
            System.out.print("\"");   
        }   
        System.out.print(">");   
    }   
       
  /** *//**  
   * 元素中字符數據事件:接收元素中字符數據  
   * 注意:1.應用程序不要試圖讀取ch數組指定範圍外的數據,(即start至length之外)  
   *      2.有些解析器將使用ignorableWhitespace()方法來報告元素內容中的空白,而不是characters()方法,如:進行有效性驗證的解析器  
   */  
    public void characters(char[] ch, int start, int length) throws SAXException   
    {   
        System.out.print(new String(ch,start,length));   
    }   
  
  /** *//**  
   * 結束元素事件  
   */  
    public void endElement(String uri, String localName, String qName) throws SAXException   
    {   
        System.out.print("</"+qName+">");   
    }   
  
    public static void main(String[] args)   
    {   
        SAXParserFactory spf=SAXParserFactory.newInstance();   
           
        try  
        {   
            SAXParser sp=spf.newSAXParser();   
            sp.parse(new File("db.xml"),new SAXPrinter());   
        }   
        catch (Exception e)   
        {   
            e.printStackTrace();   
        }   
    }   
}  




import java.io.File;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAXPrinter extends DefaultHandler{ /** *//** * 文檔開始事件 */ public void startDocument() throws SAXException { System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); } /** *//** * 接收處理指令事件 */ public void processingInstruction(String target, String data) throws SAXException { System.out.println("<?"+target+" "+data+"?>"); } /** *//** * 元素開始事件 * 參數說明: * uri - 名稱空間 URI,如果元素沒有任何名稱空間 URI,或者沒有正在執行名稱空間處理,則爲空字符串。 * localName - 本地名稱(不帶前綴),如果沒有正在執行名稱空間處理,則爲空字符串。 * qName - 限定的名稱(帶有前綴),如果限定的名稱不可用,則爲空字符串。 * attributes - 附加到元素的屬性。如果沒有屬性,則它將是空的 Attributes 對象。 */ public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { System.out.print("<"+qName);//輸出元素名稱 int len=attrs.getLength();//元素屬性列表長度 //利用循環輸出屬性列表 for(int i=0;i<len;i++) { System.out.print(" "); System.out.print(attrs.getQName(i)); System.out.print("=\""); System.out.print(attrs.getValue(i)); System.out.print("\""); } System.out.print(">"); } /** *//** * 元素中字符數據事件:接收元素中字符數據 * 注意:1.應用程序不要試圖讀取ch數組指定範圍外的數據,(即start至length之外) * 2.有些解析器將使用ignorableWhitespace()方法來報告元素內容中的空白,而不是characters()方法,如:進行有效性驗證的解析器 */ public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch,start,length)); } /** *//** * 結束元素事件 */ public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</"+qName+">"); } public static void main(String[] args) { SAXParserFactory spf=SAXParserFactory.newInstance(); try { SAXParser sp=spf.newSAXParser(); sp.parse(new File("db.xml"),new SAXPrinter()); } catch (Exception e) { e.printStackTrace(); } }}

SAX解析實例二

org.xml.sax.ContentHandler接口: 通過實現該接口給出自己的解析實現。

org.xml.sax.ErrorHandler接口:如果SAX應用程序需要實現定製的錯誤處理,那麼它必須實現這個接口,並調用XMLReader對象的setErrorHandler()方法向解析器註冊異常處理實例,這樣,解析器將通過這個接口報告所有的錯誤和警告。

ContentHandlerImpl.java

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

import org.xml.sax.Attributes;   
import org.xml.sax.ContentHandler;   
import org.xml.sax.Locator;   
import org.xml.sax.SAXException;   
  
public class ContentHandlerImpl implements ContentHandler   
{   
  /** *//**  
   * 文檔開始事件  
   */  
  public void startDocument() throws SAXException   
  {   
    System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");   
  }   
     
  /** *//**  
   * 接收處理指令事件  
   */  
  public void processingInstruction(String target, String data) throws SAXException   
  {   
    System.out.println("<?"+target+" "+data+"?>");   
  }   
     
  /** *//**  
   * 元素開始事件  
   * 參數說明:  
   *   uri - 名稱空間 URI,如果元素沒有任何名稱空間 URI,或者沒有正在執行名稱空間處理,則爲空字符串。  
   *   localName - 本地名稱(不帶前綴),如果沒有正在執行名稱空間處理,則爲空字符串。  
   *   qName - 限定的名稱(帶有前綴),如果限定的名稱不可用,則爲空字符串。  
   *   attributes - 附加到元素的屬性。如果沒有屬性,則它將是空的 Attributes 對象。  
   */  
  public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException   
  {   
    System.out.print("<"+qName);//輸出元素名稱   
    int len=attrs.getLength();//元素屬性列表長度   
       
    //利用循環輸出屬性列表   
    for(int i=0;i<len;i++)   
    {   
      System.out.print(" ");   
      System.out.print(attrs.getQName(i));   
      System.out.print("=\"");   
      System.out.print(attrs.getValue(i));   
      System.out.print("\"");   
    }   
    System.out.print(">");   
  }   
     
  /** *//**  
   * 元素中字符數據事件:接收元素中字符數據  
   * 注意:1.應用程序不要試圖讀取ch數組指定範圍外的數據,(即start至length之外)  
   *      2.有些解析器將使用ignorableWhitespace()方法來報告元素內容中的空白,而不是characters()方法,如:進行有效性驗證的解析器  
   */  
  public void characters(char[] ch, int start, int length) throws SAXException   
  {   
    System.out.print(new String(ch,start,length));   
  }   
  
  /** *//**  
   * 結束元素事件  
   */  
  public void endElement(String uri, String localName, String qName) throws SAXException   
  {   
    System.out.print("</"+qName+">");   
  }   
  
  public void endDocument() throws SAXException   
  {   
       
  }   
  
  public void endPrefixMapping(String prefix) throws SAXException   
  {   
       
  }   
  
  public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException   
  {   
       
  }   
  
  public void setDocumentLocator(Locator locator)   
  {   
       
  }   
  
  public void skippedEntity(String name) throws SAXException   
  {   
       
  }   
  
  public void startPrefixMapping(String prefix, String uri) throws SAXException   
  {   
       
  }   
  
}   




import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.Locator;import org.xml.sax.SAXException;public class ContentHandlerImpl implements ContentHandler{ /** *//** * 文檔開始事件 */ public void startDocument() throws SAXException { System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); } /** *//** * 接收處理指令事件 */ public void processingInstruction(String target, String data) throws SAXException { System.out.println("<?"+target+" "+data+"?>"); } /** *//** * 元素開始事件 * 參數說明: * uri - 名稱空間 URI,如果元素沒有任何名稱空間 URI,或者沒有正在執行名稱空間處理,則爲空字符串。 * localName - 本地名稱(不帶前綴),如果沒有正在執行名稱空間處理,則爲空字符串。 * qName - 限定的名稱(帶有前綴),如果限定的名稱不可用,則爲空字符串。 * attributes - 附加到元素的屬性。如果沒有屬性,則它將是空的 Attributes 對象。 */ public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { System.out.print("<"+qName);//輸出元素名稱 int len=attrs.getLength();//元素屬性列表長度 //利用循環輸出屬性列表 for(int i=0;i<len;i++) { System.out.print(" "); System.out.print(attrs.getQName(i)); System.out.print("=\""); System.out.print(attrs.getValue(i)); System.out.print("\""); } System.out.print(">"); } /** *//** * 元素中字符數據事件:接收元素中字符數據 * 注意:1.應用程序不要試圖讀取ch數組指定範圍外的數據,(即start至length之外) * 2.有些解析器將使用ignorableWhitespace()方法來報告元素內容中的空白,而不是characters()方法,如:進行有效性驗證的解析器 */ public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch,start,length)); } /** *//** * 結束元素事件 */ public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</"+qName+">"); } public void endDocument() throws SAXException { } public void endPrefixMapping(String prefix) throws SAXException { } public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { } public void setDocumentLocator(Locator locator) { } public void skippedEntity(String name) throws SAXException { } public void startPrefixMapping(String prefix, String uri) throws SAXException { }}

ErrorHandlerImpl.java 

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

public class ErrorHandlerImpl implements ErrorHandler   
{   
  
  public void warning(SAXParseException e) throws SAXException   
  {   
    System.out.println("[Warning ]"+getLocationString(e)+":"+e.getMessage());   
  }   
  
  public void error(SAXParseException e) throws SAXException   
  {   
    System.out.println("[Error ]"+getLocationString(e)+":"+e.getMessage());   
  }   
  
  public void fatalError(SAXParseException e) throws SAXException   
  {   
    System.out.println("[Fatal Error ]"+getLocationString(e)+":"+e.getMessage());   
  }   
  
  private String getLocationString(SAXParseException e)   
  {   
    StringBuffer sb=new StringBuffer();   
    String publicId=e.getPublicId();   
    if(publicId!=null)   
    {   
      sb.append(publicId);   
      sb.append(" ");   
    }   
       
    String systemId=e.getSystemId();   
    if(systemId!=null)   
    {   
      sb.append(systemId);   
      sb.append(" ");   
    }   
       
    sb.append(e.getLineNumber());   
    sb.append(":");   
    sb.append(e.getColumnNumber());   
    return sb.toString();   
  }   
}  




public class ErrorHandlerImpl implements ErrorHandler{ public void warning(SAXParseException e) throws SAXException { System.out.println("[Warning ]"+getLocationString(e)+":"+e.getMessage()); } public void error(SAXParseException e) throws SAXException { System.out.println("[Error ]"+getLocationString(e)+":"+e.getMessage()); } public void fatalError(SAXParseException e) throws SAXException { System.out.println("[Fatal Error ]"+getLocationString(e)+":"+e.getMessage()); } private String getLocationString(SAXParseException e) { StringBuffer sb=new StringBuffer(); String publicId=e.getPublicId(); if(publicId!=null) { sb.append(publicId); sb.append(" "); } String systemId=e.getSystemId(); if(systemId!=null) { sb.append(systemId); sb.append(" "); } sb.append(e.getLineNumber()); sb.append(":"); sb.append(e.getColumnNumber()); return sb.toString(); }}

SaxParserTest.java 

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

import java.io.FileInputStream;   

  
import org.xml.sax.InputSource;   
import org.xml.sax.XMLReader;   
import org.xml.sax.helpers.XMLReaderFactory;   
  
public class SaxParserTest   
{   
  public static void main(String[] args)   
  {   
    try  
    {   
      XMLReader xmlReader=XMLReaderFactory.createXMLReader();   
      //關閉或打開驗證   
      xmlReader.setFeature("http://xml.org/sax/features/validation",true);   
      //註冊事件處理器   
      xmlReader.setContentHandler(new ContentHandlerImpl());   
      //註冊異常處理器   
      xmlReader.setErrorHandler(new ErrorHandlerImpl());   
         
      xmlReader.parse(new InputSource(new FileInputStream("saxdb.xml")));   
    } catch (Exception e)   
    {   
      System.out.println(e.getMessage());   
    }   
  }   
}  


 

import java.io.FileInputStream;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import org.xml.sax.helpers.XMLReaderFactory;public class SaxParserTest{ public static void main(String[] args) { try { XMLReader xmlReader=XMLReaderFactory.createXMLReader(); //關閉或打開驗證 xmlReader.setFeature("http://xml.org/sax/features/validation",true); //註冊事件處理器 xmlReader.setContentHandler(new ContentHandlerImpl()); //註冊異常處理器 xmlReader.setErrorHandler(new ErrorHandlerImpl()); xmlReader.parse(new InputSource(new FileInputStream("saxdb.xml"))); } catch (Exception e) { System.out.println(e.getMessage()); } }}

第二種:DOM解析

DOM中的核心概念就是節點。DOM在分析XML文檔時,將將組成XML文檔的各個部分(元素、屬性、文本、註釋、處理指令等)映射爲一個對象(節點)。在內存中,這些節點形成一課文檔樹。整棵樹是一個節點,樹中的每一個節點也是一棵樹(子樹),可以說,DOM就是對這棵樹的一個對象描述,我們通過訪問樹中的節點來存取XML文檔的內容。

PS:屬性節點是附屬於元素的,不能被看做是元素的子節點,更不能作爲一個單獨的節點

DOMPrinter.java

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

import org.w3c.dom.Document;   
import org.w3c.dom.NamedNodeMap;   
import org.w3c.dom.Node;   
  
import com.sun.org.apache.xerces.internal.parsers.DOMParser;   
  
public class DOMPrinter   
{   
  public static void main(String[] args)   
  {   
    try  
    {   
      /** *//** 獲取Document對象 */  
      DOMParser parser = new DOMParser();   
      parser.parse("db.xml");   
      Document document = parser.getDocument();   
      printNode(document);   
    } catch (Exception e)   
    {   
      e.printStackTrace();   
    }   
  }   
     
  public static void printNode(Node node)   
  {   
    short nodeType=node.getNodeType();   
    switch(nodeType)   
    {   
    case Node.PROCESSING_INSTRUCTION_NODE://預處理指令類型   
      printNodeInfo(node);   
      break;   
    case Node.ELEMENT_NODE://元素節點類型   
      printNodeInfo(node);   
      printAttribute(node);   
      break;   
    case Node.TEXT_NODE://文本節點類型   
      printNodeInfo(node);   
      break;   
    default:   
      break;   
    }   
       
    Node child=node.getFirstChild();   
    while(child!=null)   
    {   
      printNode(child);   
      child=child.getNextSibling();   
    }   
  }   
     
  /** *//**  
   * 根據節點類型打印節點  
   * @param node  
   */  
  public static void printNodeInfo(Node node)   
  {   
    if (node.getNodeType() == Node.ELEMENT_NODE)   
    {   
      System.out.println("NodeName: " + node.getNodeName());   
    }   
    else if (node.getNodeType() == Node.TEXT_NODE)   
    {   
      String value = node.getNodeValue().trim();   
      if (!value.equals(""))   
        System.out.println("NodeValue: " + value);   
      else  
        System.out.println();   
    }else  
    {   
      System.out.println(node.getNodeName()+" : "+node.getNodeValue());   
    }   
  }   
     
  /** *//**  
   * 打印節點屬性  
   * @param aNode 節點  
   */  
  public static void printAttribute(Node aNode)   
  {   
    NamedNodeMap attrs = aNode.getAttributes();   
    if(attrs!=null)   
    {   
      for (int i = 0; i < attrs.getLength(); i++)   
      {   
        Node attNode = attrs.item(i);   
        System.out.println("Attribute: " + attNode.getNodeName() + "=\"" + attNode.getNodeValue()+"\"");   
      }   
    }   
  }  




import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import com.sun.org.apache.xerces.internal.parsers.DOMParser;public class DOMPrinter{ public static void main(String[] args) { try { /** *//** 獲取Document對象 */ DOMParser parser = new DOMParser(); parser.parse("db.xml"); Document document = parser.getDocument(); printNode(document); } catch (Exception e) { e.printStackTrace(); } } public static void printNode(Node node) { short nodeType=node.getNodeType(); switch(nodeType) { case Node.PROCESSING_INSTRUCTION_NODE://預處理指令類型 printNodeInfo(node); break; case Node.ELEMENT_NODE://元素節點類型 printNodeInfo(node); printAttribute(node); break; case Node.TEXT_NODE://文本節點類型 printNodeInfo(node); break; default: break; } Node child=node.getFirstChild(); while(child!=null) { printNode(child); child=child.getNextSibling(); } } /** *//** * 根據節點類型打印節點 * @param node */ public static void printNodeInfo(Node node) { if (node.getNodeType() == Node.ELEMENT_NODE) { System.out.println("NodeName: " + node.getNodeName()); } else if (node.getNodeType() == Node.TEXT_NODE) { String value = node.getNodeValue().trim(); if (!value.equals("")) System.out.println("NodeValue: " + value); else System.out.println(); }else { System.out.println(node.getNodeName()+" : "+node.getNodeValue()); } } /** *//** * 打印節點屬性 * @param aNode 節點 */ public static void printAttribute(Node aNode) { NamedNodeMap attrs = aNode.getAttributes(); if(attrs!=null) { for (int i = 0; i < attrs.getLength(); i++) { Node attNode = attrs.item(i); System.out.println("Attribute: " + attNode.getNodeName() + "=\"" + attNode.getNodeValue()+"\""); } } }

DOM生成XML文檔:DOMCreateExample.java 

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

import java.io.FileNotFoundException;   
import java.io.FileOutputStream;   
import java.io.IOException;   
  
import javax.xml.parsers.DocumentBuilder;   
import javax.xml.parsers.DocumentBuilderFactory;   
import javax.xml.parsers.ParserConfigurationException;   
  
import org.w3c.dom.Document;   
import org.w3c.dom.Element;   
  
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;   
  
public class DOMCreateExample   
{   
  public static void main(String[] args) throws ParserConfigurationException   
  {   
    //DOMImplementation domImp = DOMImplementationImpl.getDOMImplementation();   
    DocumentBuilderFactory builderFact = DocumentBuilderFactory.newInstance();   
    DocumentBuilder builder = builderFact.newDocumentBuilder();   
      
    Document doc = builder.newDocument();   
    //Document doc = domImp.createDocument(null, null, null);   
      
    Element root = doc.createElement("games");   
    Element child1 = doc.createElement("game");   
    child1.appendChild(doc.createTextNode("Final Fantasy VII"));   
    child1.setAttribute("genre", "rpg");   
    root.appendChild(child1);   
    doc.appendChild(root);   
        
     XMLSerializer serial;   
    try  
    {   
      serial = new XMLSerializer(new FileOutputStream("domcreate.xml"), null);   
      serial.serialize(doc);   
    } catch (FileNotFoundException e1)   
    {   
      e1.printStackTrace();   
    } catch (IOException e)   
    {   
      e.printStackTrace();   
    }   
  }   
}  




import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import com.sun.org.apache.xml.internal.serialize.XMLSerializer;public class DOMCreateExample{ public static void main(String[] args) throws ParserConfigurationException { //DOMImplementation domImp = DOMImplementationImpl.getDOMImplementation(); DocumentBuilderFactory builderFact = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = builderFact.newDocumentBuilder(); Document doc = builder.newDocument(); //Document doc = domImp.createDocument(null, null, null); Element root = doc.createElement("games"); Element child1 = doc.createElement("game"); child1.appendChild(doc.createTextNode("Final Fantasy VII")); child1.setAttribute("genre", "rpg"); root.appendChild(child1); doc.appendChild(root); XMLSerializer serial; try { serial = new XMLSerializer(new FileOutputStream("domcreate.xml"), null); serial.serialize(doc); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}

第三種JDOM解析

JDOM利用了java語言的優秀特性,極大地簡化了對XML文檔的處理,相比DOM簡單易用。JDOM也使用對象樹來表示XML文檔,JDOM使用SAXj解析器來分析XML文檔,構建JDOM樹。然而JOMD本身並沒有提供解析器,它使用其他開發商提供的標準SAX解析器,JDOM默認通過JAXP來選擇解析器,可以通過手動知道解析器的類名來設置。

首先要在工程中添加jdom的jar包,這裏使用jdom1.0.jar。(見附件)

JDOMConvert.java 

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

import java.io.File;   
  
import org.jdom.Document;   
import org.jdom.Element;   
import org.jdom.input.SAXBuilder;   
import org.jdom.output.Format;   
import org.jdom.output.XMLOutputter;   
  
public class JDOMConvert   
{   
    public static void main(String[] args)   
    {   
        SAXBuilder saxBuilder=new SAXBuilder();   
        try  
        {   
            Document doc=saxBuilder.build(new File("domdb.xml"));   
         
      //首先創建好節點   
      Element eltDb=new Element("db");   
      Element eltDriver=new Element("driver");   
      Element eltUrl=new Element("url");   
      Element eltUser=new Element("user");   
      Element eltPassword=new Element("password");   
         
      //設置節點的值   
      eltDriver.setText("com.mysql.jdbc.Driver");   
      eltUrl.setText("jdbc:mysql://localhost/mySql");   
      eltUser.setText("root");   
      eltPassword.setText("xlc");   
         
      //添加到根節點   
      eltDb.addContent(eltDriver);   
      eltDb.addContent(eltUrl);   
      eltDb.addContent(eltUser);   
      eltDb.addContent(eltPassword);   
      //根節點設置屬性   
      eltDb.setAttribute("type","mysql");   
         
      Element root=doc.getRootElement();   
      //root.removeChild("db");//刪除節點   
      root.addContent(eltDb);//增加節點   
         
      //修改db節點中內容   
      root.getChild("db").getChild("user").setText("system");   
      root.getChild("db").getChild("password").setText("manager");   
         
            XMLOutputter xmlOut=new XMLOutputter();   
               
      //設置XML格式   
            Format fmt=Format.getPrettyFormat();   
            fmt.setIndent("    ");   
            fmt.setEncoding("utf-8");   
               
            xmlOut.setFormat(fmt);   
            xmlOut.output(doc,System.out);   
        }   
        catch (Exception e)   
        {   
            e.printStackTrace();   
        }   
    }   
}  




import java.io.File;import org.jdom.Document;import org.jdom.Element;import org.jdom.input.SAXBuilder;import org.jdom.output.Format;import org.jdom.output.XMLOutputter;public class JDOMConvert{ public static void main(String[] args) { SAXBuilder saxBuilder=new SAXBuilder(); try { Document doc=saxBuilder.build(new File("domdb.xml")); //首先創建好節點 Element eltDb=new Element("db"); Element eltDriver=new Element("driver"); Element eltUrl=new Element("url"); Element eltUser=new Element("user"); Element eltPassword=new Element("password"); //設置節點的值 eltDriver.setText("com.mysql.jdbc.Driver"); eltUrl.setText("jdbc:mysql://localhost/mySql"); eltUser.setText("root"); eltPassword.setText("xlc"); //添加到根節點 eltDb.addContent(eltDriver); eltDb.addContent(eltUrl); eltDb.addContent(eltUser); eltDb.addContent(eltPassword); //根節點設置屬性 eltDb.setAttribute("type","mysql"); Element root=doc.getRootElement(); //root.removeChild("db");//刪除節點 root.addContent(eltDb);//增加節點 //修改db節點中內容 root.getChild("db").getChild("user").setText("system"); root.getChild("db").getChild("password").setText("manager"); XMLOutputter xmlOut=new XMLOutputter(); //設置XML格式 Format fmt=Format.getPrettyFormat(); fmt.setIndent(" "); fmt.setEncoding("utf-8"); xmlOut.setFormat(fmt); xmlOut.output(doc,System.out); } catch (Exception e) { e.printStackTrace(); } }}

JDOM生成XML文檔:JDOMCreate.java 

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

import java.io.IOException;   
  
import org.jdom.Document;   
import org.jdom.Element;   
import org.jdom.output.XMLOutputter;   
  
public class JDOMCreate   
{   
  public static void main(String[] args)   
  {   
    Document doc = new Document(new Element("games"));   
    Element newGame = new Element("game").setText("Final Fantasy VI");   
    doc.getRootElement().addContent(newGame);   
    newGame.setAttribute("genre", "rpg");   
    XMLOutputter domstream = new XMLOutputter();   
    try  
    {   
      domstream.output(doc, System.out);   
    } catch (IOException e)   
    {   
      e.printStackTrace();   
    }   
  }   
}  




import java.io.IOException;import org.jdom.Document;import org.jdom.Element;import org.jdom.output.XMLOutputter;public class JDOMCreate{ public static void main(String[] args) { Document doc = new Document(new Element("games")); Element newGame = new Element("game").setText("Final Fantasy VI"); doc.getRootElement().addContent(newGame); newGame.setAttribute("genre", "rpg"); XMLOutputter domstream = new XMLOutputter(); try { domstream.output(doc, System.out); } catch (IOException e) { e.printStackTrace(); } }}

第四種:DOM4J解析

dom4j與JDOM一樣,也是一種用於解析XML文檔的開放源代碼的XML框架,dom4j也應用於java平臺,dom4j API使用了java集合框架並完全支持DOM、SAX和JAXP。與JDOM不同的是,dom4j使用接口和抽象類,雖然dom4j的API相對複雜些,但它提供了比JDOM更好的靈活性。dom4j也使用SAX解析器來分析XML文檔,創建dom4j樹。此外dom4j也可以接收DOM格式的內容,並提供了從dom4j樹到SAX事件流或W3C DOM樹的輸出機制。與JDOM不同,dom4j自帶了一個SAX解析器Aelfred2,如果沒有顯示的設置SAX解析器,也沒有通過系統屬性org.xml.sax.driver設置解析器,dom3j將會使用JAXP來加載JAXP配置的解析器,如果創建解析器失敗,那麼最後才使用dom4j自帶的Aelfred2解析器。

同樣,首先要在工程中添加dom4j的jar包,這裏使用dom4j-1.6.1.jar。(見附件)

Dom4j生成XML文檔db.xml:Dom4jCreate.java

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

import java.io.IOException;   
  
import org.dom4j.Document;   
import org.dom4j.DocumentHelper;   
import org.dom4j.Element;   
import org.dom4j.io.OutputFormat;   
import org.dom4j.io.XMLWriter;   
  
public class Dom4jCreate   
{   
  
  public static void main(String[] args)   
  {   
    Document doc = DocumentHelper.createDocument();   
  
    doc.addProcessingInstruction("xml-stylesheet", "type='text/xsl' href='db.xsl'");   
    doc.addDocType("dbconfig", null,"db.dtd");   
       
    //Element root=DocumentHelper.createElement("dbconfig");   
    // doc.setRootElement(root);   
    Element root = doc.addElement("dbconfig");   
  
    Element eltDb= root.addElement("db");   
    Element eltDriver = eltDb.addElement("driver");   
    Element eltUrl = eltDb.addElement("url");   
    Element eltUser = eltDb.addElement("user");   
    Element eltPassword = eltDb.addElement("password");   
       
    eltDriver.setText("com.mysql.jdbc.Driver");   
    eltUrl.setText("jdbc:mysql://localhost/mySql");   
    eltUser.setText("root");   
    eltPassword.setText("xlc");   
    eltDb.addAttribute("type","mysql");   
           
    try  
    {   
      //設置輸出格式   
      OutputFormat outFmt = new OutputFormat("    ", true);   
      outFmt.setEncoding("UTF-8");   
         
      /**//*PrintWriter pw = new PrintWriter(System.out);  
      doc.write(pw);  
      pw.flush();  
      pw.close();*/  
  
      XMLWriter xmlWriter = new XMLWriter(System.out, outFmt);   
      // XMLWriter xmlWriter=new XMLWriter(new FileWriter("db.xml"),outFmt);   
      xmlWriter.write(doc);   
      xmlWriter.flush();   
      xmlWriter.close();   
    } catch (IOException e)   
    {   
      e.printStackTrace();   
    }   
  }   
}  




import java.io.IOException;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;public class Dom4jCreate{ public static void main(String[] args) { Document doc = DocumentHelper.createDocument(); doc.addProcessingInstruction("xml-stylesheet", "type='text/xsl' href='db.xsl'"); doc.addDocType("dbconfig", null,"db.dtd"); //Element root=DocumentHelper.createElement("dbconfig"); // doc.setRootElement(root); Element root = doc.addElement("dbconfig"); Element eltDb= root.addElement("db"); Element eltDriver = eltDb.addElement("driver"); Element eltUrl = eltDb.addElement("url"); Element eltUser = eltDb.addElement("user"); Element eltPassword = eltDb.addElement("password"); eltDriver.setText("com.mysql.jdbc.Driver"); eltUrl.setText("jdbc:mysql://localhost/mySql"); eltUser.setText("root"); eltPassword.setText("xlc"); eltDb.addAttribute("type","mysql"); try { //設置輸出格式 OutputFormat outFmt = new OutputFormat(" ", true); outFmt.setEncoding("UTF-8"); /**//*PrintWriter pw = new PrintWriter(System.out); doc.write(pw); pw.flush(); pw.close();*/ XMLWriter xmlWriter = new XMLWriter(System.out, outFmt); // XMLWriter xmlWriter=new XMLWriter(new FileWriter("db.xml"),outFmt); xmlWriter.write(doc); xmlWriter.flush(); xmlWriter.close(); } catch (IOException e) { e.printStackTrace(); } }}

Dom4j修改XML文檔db.xml:Dom4jModify.java

Java代碼 xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J) - ←甜咖啡 - Sorry My World

import java.io.File;   
import java.io.FileWriter;   
import java.util.Iterator;   
import java.util.List;   
  
import org.dom4j.Document;   
import org.dom4j.Element;   
import org.dom4j.io.OutputFormat;   
import org.dom4j.io.SAXReader;   
import org.dom4j.io.XMLWriter;   
  
public class Dom4jModify   
{   
  public Document modifyDocument(File inputXml)   
  {   
    try  
    {   
      SAXReader saxReader = new SAXReader();   
      Document document = saxReader.read(inputXml);   
      document.addDocType("dbconfig",null,"db.dtd");   
      List list = document.content();   
  
      // Iterator iter = document.nodeIterator();   
      Iterator iter = list.iterator();   
  
      Element element = (Element) iter.next();   
      element.element("db").attribute("type").setValue("mysql");   
      element.element("db").element("url").setText("jdbc:mysql://localhost/mySql");   
      element.element("db").element("driver").setText("com.mysql.jdbc.Driver");   
      element.element("db").element("user").setText("root");   
      element.element("db").element("password").setText("xlc");   
         
      // 設置輸出格式   
      OutputFormat outFmt = new OutputFormat("    ", true);   
      outFmt.setEncoding("UTF-8");   
         
      XMLWriter xmlWriter=new XMLWriter(new FileWriter("domdb-modified.xml"),outFmt);   
      xmlWriter.write(document);   
      xmlWriter.flush();   
      xmlWriter.close();   
      return document;   
    }   
    catch (Exception e)   
    {   
      System.out.println(e.getMessage());   
      return null;   
    }   
  }   
  
  public static void main(String[] args) throws Exception   
  {   
    Dom4jModify dom4jParser = new Dom4jModify();   
    Document document = dom4jParser.modifyDocument(new File("domdb.xml"));   
       
    OutputFormat outFmt = new OutputFormat("    ", true);   
    outFmt.setEncoding("UTF-8");   
    XMLWriter xmlWriter = new XMLWriter(System.out,outFmt);   
    xmlWriter.write(document);   
    xmlWriter.flush();   
    xmlWriter.close();   
  }   
} 



 

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