DOM4J與利用DOM、SAX、JAXP機制來解析xml相比,DOM4J 表現更優秀,具備性能優異、功能強大和極端易用使用的特色,只要懂得DOM基本概念,就能夠經過dom4j的api文檔來解析xml。dom4j是一套開源的api。實際項目中,每每選擇dom4j來做爲解析xml的利器。html
針對於XML標準定義,對應於圖2-1列出的內容,dom4j提供瞭如下實現:java
經常使用APInode
org.dom4j.io.SAXReaderjson
org.dom4j.Documentapi
org.dom4j.Nodedom
org.dom4j.Element性能
org.dom4j.Attribute編碼
org.dom4j.Texturl
org.dom4j.CDATAspa
org.dom4j.Comment
下面作了一個類以以下的XML爲例:
<html> <head> <title>解析xml例子</title> <script> <username>yangrong</username> <password>123456</password> </script> </head> <body> <result>0</result> <form> <banlce>1000</banlce> <subID>36242519880716</subID> </form> </body> </html>
import java.util.HashMap;
import java.util.Iterator; import java.util.Map; import java.util.List; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.URL; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import com.alibaba.fastjson.JSON; public class OperateXml { @SuppressWarnings("unused") public static void main(String[] args) { // 下面是須要解析的xml字符串例子 String xmlString = "<html><head><title>解析xml例子</title><script><username>yangrong</username><password>123456</password></script></head><body><result>0</result><form><banlce>1000</banlce><subID>36242519880716</subID></form></body></html>"; //主動建立document對象. Document document=DocumentHelper.createDocument();//創建document對象,用來操做xml文件 Document testdoc=DocumentHelperreadStringXml(xmlString); //將文檔或節點的XML轉化爲字符串. String docXmlText=testdoc.asXML(); String teststring=Documentanalysis1(testdoc); System.out.print(teststring); } public static Document DocumentHelperreadStringXml(String xmlContent) { // DocumentHelper 解析xml字符串 Document document = null; try { document = DocumentHelper.parseText(xmlContent); } catch (DocumentException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return document; } public static Document SAXReaderreadStringXml(String xmlContent) throws DocumentException, UnsupportedEncodingException { /* SAXReader解析xml字符串 */ Document document = null; try { // 讀取輸入流 SAXReader saxReader = new SAXReader(); document = saxReader.read(new ByteArrayInputStream(xmlContent.getBytes("utf-8")));// 字符串要根據相應的編碼轉成輸入流才能被SAXReader讀取。 } catch (Exception ex) { ex.printStackTrace(); } return document; } // 讀寫XML文檔主要依賴於org.dom4j.io包,有DOMReader和SAXReader兩種方式。由於利用了相同的接口,它們的調用方式是同樣的。 public static Document SAXReaderreadfile(String filename) { /* SAXReader解析xml文件 */ Document document = null; try { SAXReader saxReader = new SAXReader(); document = saxReader.read(new File(filename)); // 讀取XML文件,得到document對象 } catch (Exception ex) { ex.printStackTrace(); } return document; } public static Document SAXReaderreadurl(URL url) { Document document = null; try { SAXReader saxReader = new SAXReader(); document = saxReader.read(url); // 讀取XML文件,得到document對象 } catch (Exception ex) { ex.printStackTrace(); } return document; } // 根節點是xml分析的開始,任何xml分析工做都須要從根開始 @SuppressWarnings("unchecked") public static String Documentanalysis1(Document doc) { Map<String, String> uploadMap = new HashMap<String, String>(); Element html = doc.getRootElement();// 獲取根結點 Element head = html.element("head");// 獲取子結點 Element title = head.element("title");// 獲取子子結點 Element script = head.element("script");// 獲取子子結點 String text=script.elementText("username");//這個是取得script節點下的username字節點的文字. // 獲得根元素的全部子節點 List<Element> elist = script.elements(); // 遍歷全部子節點 for (int i = 0; i < elist.size(); i++) { Element e = elist.get(i); uploadMap.put(e.getName(), e.getText()); } return JSON.toJSONString(uploadMap); } @SuppressWarnings("rawtypes") public static String Documentanalysis2(Document doc) { // 將解析結果存儲在HashMap中 Map<String, String> uploadMap = new HashMap<String, String>(); // 獲得xml根元素 Element root = doc.getRootElement(); Iterator forms = root.element("body").element("form").elementIterator(); // 獲取ticketNotify節點下全部的ticket節點的配置屬性,並將其放到Map中 /* // 建立迭代器,用來查找要刪除的節點,迭代器至關於指針,指向root下全部的title節點 Iterator iterator =root.elementIterator("title");*/ while (forms.hasNext()) { Element e = (Element) forms.next(); uploadMap.put(e.getName(), e.getText()); } return JSON.toJSONString(uploadMap); } @SuppressWarnings("unchecked") public static String Documentanalysis3(Document doc) { // 將解析結果存儲在HashMap中 Map<String, String> uploadMap = new HashMap<String, String>(); // 用Document的selectNodes來讀取節點,返回list List<Element> elementList = doc.selectNodes("/html/body/form/*");
/* 選取未知節點
XPath 通配符可用來選取未知的 XML 元素。
通配符 描述
* 匹配任何元素節點。
@* 匹配任何屬性節點。
node() 匹配任何類型的節點。*/
for (Element e : elementList) { uploadMap.put(e.getName(), e.getText()); } return JSON.toJSONString(uploadMap); } // 添加xml節點,addroot爲即將插入節點的父節點 public static void addElement(Element addroot, String elementname, String elementvalue) { Element childelement = addroot.addElement(elementname); childelement.setText(elementvalue); } // 刪除xml節點,addroot爲即將刪除節點的父節點 public static void addElement(Element addroot, String elementname) { addroot.remove(addroot.element(elementname)); } //寫入XML文件,可設置編碼方式設置encodetype爲"",默認爲UTF-8 public static boolean doc2XmlFile(Document document, String filename,String encodetype) { boolean flag = true; try { //經過XMLWriter將Document對象表示的XML樹寫入指定的文件 XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(filename), "".equals(encodetype)?"UTF-8":encodetype)); writer.write(document); writer.close(); } catch (Exception ex) { flag = false; ex.printStackTrace(); } System.out.println(flag); return flag; } //建立xml文件 public static void WriterXmltoFile(Document document, String filename,String encodetype) { OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding(encodetype); // 指定XML編碼 try{ XMLWriter writer=new XMLWriter(new FileWriter(new File(filename)),format); writer.write(document); writer.close(); }catch(Exception e){ e.printStackTrace(); } } }
Element類
getQName() |
元素的QName對象 |
getNamespace() |
元素所屬的Namespace對象 |
getNamespacePrefix() |
元素所屬的Namespace對象的prefix |
getNamespaceURI() |
元素所屬的Namespace對象的URI |
getName() |
元素的local name |
getQualifiedName() |
元素的qualified name |
getText() |
元素所含有的text內容,若是內容爲空則返回一個空字符串而不是null |
getTextTrim() |
元素所含有的text內容,其中連續的空格被轉化爲單個空格,該方法不會返回null |
attributeIterator() |
元素屬性的iterator,其中每一個元素都是Attribute對象 |
attributeValue() |
元素的某個指定屬性所含的值 |
elementIterator() |
元素的子元素的iterator,其中每一個元素都是Element對象 |
element() |
元素的某個指定(qualified name或者local name)的子元素 |
elementText() |
元素的某個指定(qualified name或者local name)的子元素中的text信息 |
getParent |
元素的父元素 |
getPath() |
元素的XPath表達式,其中父元素的qualified name和子元素的qualified name之間使用"/"分隔 |
isTextOnly() |
是否該元素只含有text或是空元素 |
isRootElement() |
是否該元素是XML樹的根節點 |