1. 程式人生 > >記錄4種解析xml字串的方法

記錄4種解析xml字串的方法

package xml;

import java.io.IOException;
import java.io.StringReader;
import java.util.Iterator;
import java.util.List;

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



import
org.dom4j.DocumentHelper; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @description
4種 XML格式的字串讀取方式 簡單比較 * * @date 2015年12月31日 */
public class ReadXmlString { public static void main(String[] args) throws Exception { String xmlStr = "<message><a>try</a><b>try</b><c>try</c><d>try</d><e>try</e><f>try</f><g>try</g><h>try</h><i>do you konw?</i><世界>你好!</世界></message>"
; long begin = System.currentTimeMillis(); parse4Dom(xmlStr); long after = System.currentTimeMillis(); System.out.println("DOM用時" + (after - begin) + "毫秒"); begin = System.currentTimeMillis(); parse4Sax(xmlStr); after = System.currentTimeMillis(); System.out.println("SAX用時" + (after - begin) + "毫秒"); begin = System.currentTimeMillis(); parse4DOM4j(xmlStr); after = System.currentTimeMillis(); System.out.println("DOM4j用時" + (after - begin) + "毫秒"); begin = System.currentTimeMillis(); parse4JDOM(xmlStr); after = System.currentTimeMillis(); System.out.println("JDOM用時" + (after - begin) + "毫秒"); } /** * @description JDOM解析,需要下載對應的jar包 * @param xmlStr * @throws Exception * @time 2016年1月1日 上午2:04:03 */ private static void parse4JDOM(String xmlStr) throws Exception { SAXBuilder builder=new SAXBuilder(false); org.jdom.Document doc = builder.build(new InputSource(new StringReader(xmlStr))); org.jdom.Element root = doc.getRootElement(); // 得到根元素 System.out.println("根節點" + root.getName()); List<org.jdom.Element> list = root.getChildren(); // 得到元素的集合 //List studentList = students.getChildren("student"); // 得到指定元素(節點)的集合 if( list!=null){ for (int i = 0; i < list.size(); i++) { org.jdom.Element element = (org.jdom.Element)list.get(i); System.out.println("節點=" + element.getName() + "\ttext=" + element.getValue()); } } } /** * @description DOM4J解析,需要下載對應的jar包 * @param xmlStr * @throws Exception * @time 2016年1月1日 上午1:52:58 */ private static void parse4DOM4j(String xmlStr) throws Exception { org.dom4j.Document doc=(org.dom4j.Document)DocumentHelper.parseText(xmlStr); org.dom4j.Element message = doc.getRootElement(); System.out.println("根節點" + message.getName()); Iterator elements = message.elementIterator(); while(elements.hasNext()){ org.dom4j.Element element = (org.dom4j.Element)elements.next(); System.out.println("節點" + element.getName() + "\ttext=" + element.getText()); System.out.println(); } } /** * @description java自帶的SAX解析 * @param xmlStr * @author liuquan * @throws Exception * @date 2015年12月31日 */ private static void parse4Sax(String xmlStr) throws Exception { SAXParserFactory saxfac = SAXParserFactory.newInstance(); SAXParser saxparser = saxfac.newSAXParser(); // 為演示方便 寫成匿名內部類 saxparser.parse(new InputSource(new StringReader(xmlStr)), new myHandler()); } /** * @description java自帶的DOM解析. * @param xmlStr * @author liuquan * @throws Exception * @date 2015年12月31日 */ private static void parse4Dom(String xmlStr) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xmlStr))); Element message = doc.getDocumentElement(); NodeList list = message.getChildNodes(); if (list != null) { for (int i = 0; i < list.getLength(); i++) { Node node = list.item(i); System.out.println("節點=" + node.getNodeName() + "\ttext=" + node.getFirstChild().getNodeValue()); } } } } /** * @Description SAX解析的處理器 sax解析要多寫一個類,但是非常快 * @author liuquan * @time 2016年1月1日 上午1:53:03 */ class myHandler extends DefaultHandler { private StringBuffer buf; private String str; public myHandler() { super(); } public void startDocument() throws SAXException { buf = new StringBuffer(); System.out.println("*******開始解析XML*******"); } public void endDocument() throws SAXException { System.out.println("*******XML解析結束*******"); } public void endElement(String namespaceURI, String localName, String fullName) throws SAXException { str = buf.toString(); System.out.println("節點=" + fullName + "\tvalue=" + buf + " 長度=" + buf.length()); buf.delete(0, buf.length()); } public void characters(char[] chars, int start, int length) throws SAXException { // 將元素內容累加到StringBuffer中 buf.append(chars, start, length); } }