dom4j基本操作


DOM4J與利用DOM、SAX、JAXP機制來解析xml相比,DOM4J 表現更優秀,具有性能優異、功能強大和極端易用使用的特點,只要懂得DOM基本概念,就可以通過dom4j的api文檔來解析xml。dom4j是一套開源的api。實際項目中,往往選擇dom4j來作為解析xml的利器。

針對於XML標准定義,對應於圖2-1列出的內容,dom4j提供了以下實現:

常用API

 org.dom4j.io.SAXReader

  • read  提供多種讀取xml文件的方式,返回一個Domcument對象

 org.dom4j.Document

  • iterator  使用此法獲取node
  • getRootElement  獲取根節點

 org.dom4j.Node

  • getName  獲取node名字,例如獲取根節點名稱為bookstore
  • getNodeType  獲取node類型常量值,例如獲取到bookstore類型為1——Element
  • getNodeTypeName  獲取node類型名稱,例如獲取到的bookstore類型名稱為Element

 org.dom4j.Element

  • attributes  返回該元素的屬性列表
  • attributeValue  根據傳入的屬性名獲取屬性值
  • elementIterator  返回包含子元素的迭代器
  • elements  返回包含子元素的列表

 org.dom4j.Attribute

  • getName  獲取屬性名
  • getValue  獲取屬性值

 org.dom4j.Text

  • getText  獲取Text節點值

 org.dom4j.CDATA

  • getText  獲取CDATA Section值

 org.dom4j.Comment

  • getText  獲取注釋

下面做了一個類以如下的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樹的根節點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM