這個也是自己轉載的,現在對DOM還比較熟悉,自己不要只是複製代碼,可以試着去熟悉其中的一兩種,以後會有用處的。
xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J)
第一種:SAX解析
SAX處理機制:SAX是一種基於事件驅動的API。利用SAX解析XML文檔,牽涉到兩個部分:解析器和事件處理器。解析器負責讀取XML文檔,並向事件處理器發生事件,如元素開始和元素結束事件;而事件處理器則負責對事件做出響應,對傳遞的XML數據進行處理。
測試用的xml文件:db.xml
<?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代碼
- <!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代碼
- 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代碼
- 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代碼
- 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();
- }
- 1. }
- 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代碼
- 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代碼
- 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代碼
- 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
- 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
- <span style="color:#000000;">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();
- }
- }
- }
- </span>
第四種: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代碼
- 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
- 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();
- }
- }