java解析xml字符串方法


一,用DOM4J  針對無重復標簽的xml字符串格式,如下:

針對此種情況可用DOM4J解析法,引入 dom4j的相關jar包代碼如下:

        Document document=DocumentHelper.parseText(xmlStr);//xmlStr為上圖格式的字符串

       Node VideoCompany=document.selectSingleNode("//VideoCompany");//獲取節點對象,注意引號內的“//”必須加 ,否則報錯
       Node DevIP=document.selectSingleNode("//DevIP");
       //根據節點對象獲取相應信息      

       String videoCompany=VideoCompany.getText();

       String devIp=DevIP.getText();

       System.out.println(devIp) //此時輸出結果極為字符串:3333

二,用DOM  針對有重復標簽的xml字符串格式,如下:

       <?xml version="1.0" encoding="UTF-8"?>
        <books>
           <book id="001">
             <title>Harry Potter</title>
             <author>J K. Rowling</author>
       </book>
      <book id="002">
           <title>Learning XML</title>
          <author>Erik T. Ray</author>
     </book>
  </books>

DOM 解析 XML

Java 中的 DOM 接口簡介: JDK 中的 DOM API 遵循 W3C DOM 規范,其中 org.w3c.dom 包提供了 Document、DocumentType、Node、NodeList、Element 等接口, 這些接口均是訪問 DOM 文檔所必須的。我們可以利用這些接口創建、遍歷、修改 DOM 文檔。

javax.xml.parsers 包中的 DoumentBuilder 和 DocumentBuilderFactory 用於解析 XML 文檔生成對應的 DOM Document 對象。

javax.xml.transform.dom 和 javax.xml.transform.stream 包中 DOMSource 類和 StreamSource 類,用於將更新后的 DOM 文檔寫入 XML 文件。

下面給出一個運用 DOM 解析 XML 的例子:

 import java.io.File; 
 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 org.w3c.dom.Node; 
 import org.w3c.dom.NodeList; 
 import org.xml.sax.SAXException; 

 public class DOMParser { 
   DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
   //Load and parse XML file into DOM 
   public Document parse(String filePath) { 
      Document document = null; 
      try { 
         //DOM parser instance 
         DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
         //parse an XML file into a DOM tree 
         document = builder.parse(new File(filePath)); 
      } catch (ParserConfigurationException e) { 
         e.printStackTrace();  
      } catch (SAXException e) { 
         e.printStackTrace(); 
      } catch (IOException e) { 
         e.printStackTrace(); 
      } 
      return document; 
   } 
	
   public static void main(String[] args) { 
         DOMParser parser = new DOMParser(); 
         Document document = parser.parse("books.xml"); 
         //get root element 
         Element rootElement = document.getDocumentElement(); 

         //traverse child elements 
         NodeList nodes = rootElement.getChildNodes(); 
         for (int i=0; i < nodes.getLength(); i++) 
         { 
            Node node = nodes.item(i); 
            if (node.getNodeType() == Node.ELEMENT_NODE) {   
               Element child = (Element) node; 
               //process child element 
            } 
         } 

         NodeList nodeList = rootElement.getElementsByTagName("book"); 
         if(nodeList != null) 
         { 
            for (int i = 0 ; i < nodeList.getLength(); i++) 
            { 
               Element element = (Element)nodeList.item(i); 
               String id = element.getAttribute("id"); 
            } 
         } 
   } 
 }

在上面的例子中,DOMParser 的 Parse() 方法負責解析 XML 文件並生成對應的 DOM Document 對象。其中 DocumentBuilderFactory 用於生成 DOM 文檔解析器以便解析 XML 文檔。 在獲取了 XML 文件對應的 Document 對象之后,我們可以調用一系列的 API 方便的對文檔對象模型中的元素進行訪問和處理。 需要注意的是調用 Element 對象的 getChildNodes() 方法時將返回其下所有的子節點,其中包括空白節點,因此需要在處理子 Element 之前對節點類型加以判斷。

可以看出 DOM 解析 XML 易於開發,只需要通過解析器建立起 XML 對應的 DOM 樹型結構后便可以方便的使用 API 對節點進行訪問和處理,支持節點的刪除和修改等。 但是 DOM 解析 XML 文件時會將整個 XML 文件的內容解析成樹型結構存放在內存中,因此不適合用 DOM 解析很大的 XML 文件。

 三.SAX 解析 例二中XML

 

與 DOM 建立樹形結構的方式不同,SAX 采用事件模型來解析 XML 文檔,是解析 XML 文檔的一種更快速、更輕量的方法。 利用 SAX 可以對 XML 文檔進行有選擇的解析和訪問,而不必像 DOM 那樣加載整個文檔,因此它對內存的要求較低。 但 SAX 對 XML 文檔的解析為一次性讀取,不創建任何文檔對象,很難同時訪問文檔中的多處數據。

 import org.xml.sax.Attributes; 
 import org.xml.sax.SAXException; 
 import org.xml.sax.XMLReader; 
 import org.xml.sax.helpers.DefaultHandler; 
 import org.xml.sax.helpers.XMLReaderFactory; 

 public class SAXParser { 

   class BookHandler extends DefaultHandler { 
      private List<String> nameList; 
      private boolean title = false; 
   
      public List<String> getNameList() { 
         return nameList; 
      } 
      // Called at start of an XML document 
      @Override 
      public void startDocument() throws SAXException { 
         System.out.println("Start parsing document..."); 
         nameList = new ArrayList<String>(); 
      } 
      // Called at end of an XML document 
      @Override 
      public void endDocument() throws SAXException {  
         System.out.println("End");  
      } 
      
      /** 
       * Start processing of an element. 
       * @param namespaceURI  Namespace URI 
       * @param localName  The local name, without prefix 
       * @param qName  The qualified name, with prefix 
       * @param atts  The attributes of the element 
       */ 
      @Override 
      public void startElement(String uri, String localName, String qName, 
	     Attributes atts) throws SAXException { 
         // Using qualified name because we are not using xmlns prefixes here. 
         if (qName.equals("title")) { 
            title = true; 
         } 
      } 
   
      @Override 
      public void endElement(String namespaceURI, String localName, String qName) 
         throws SAXException { 
         // End of processing current element 
         if (title) { 
            title = false; 
         } 
      } 
   			
      @Override 
      public void characters(char[] ch, int start, int length) { 
         // Processing character data inside an element 
         if (title) { 
            String bookTitle = new String(ch, start, length); 
            System.out.println("Book title: " + bookTitle); 
            nameList.add(bookTitle); 
         } 
      } 
			
   } 
	
   public static void main(String[] args) throws SAXException, IOException { 
      XMLReader parser = XMLReaderFactory.createXMLReader(); 
      BookHandler bookHandler = (new SAXParser()).new BookHandler(); 
      parser.setContentHandler(bookHandler); 
      parser.parse("books.xml"); 
      System.out.println(bookHandler.getNameList()); 
   } 
 }

SAX 解析器接口和事件處理器接口定義在 org.xml.sax 包中。主要的接口包括 ContentHandler、DTDHandler、EntityResolver 及 ErrorHandler。 其中 ContentHandler 是主要的處理器接口,用於處理基本的文檔解析事件;DTDHandler 和 EntityResolver 接口用於處理與 DTD 驗證和實體解析相關的事件; ErrorHandler 是基本的錯誤處理接口。DefaultHandler 類實現了上述四個事件處理接口。上面的例子中 BookHandler 繼承了 DefaultHandler 類, 並覆蓋了其中的五個回調方法 startDocument()、endDocument()、startElement()、endElement() 及 characters() 以加入自己的事件處理邏輯


四、XML解析總結

 

1、【DOM】
DOM是基於樹的結構,通常需要加載整文檔和構造DOM樹,然后才能開始工作。
優點:
    a、由於整棵樹在內存中,因此可以對xml文檔隨機訪問
    b、可以對xml文檔進行修改操作
    c、較sax,dom使用也更簡單。
缺點:
    a、整個文檔必須一次性解析完
    a、由於整個文檔都需要載入內存,對於大文檔成本高
2、【SAX】
SAX類似流媒體,它基於事件驅動的,因此無需將整個文檔載入內存,使用者只需要監聽自己感興趣的事件即可。
優點:
    a、無需將整個xml文檔載入內存,因此消耗內存少
    b、可以注冊多個ContentHandler
缺點:
    a、不能隨機的訪問xml中的節點
    b、不能修改文檔
 
3、【DOM4J】
    這3中xml解析方式中,最優秀的一個,集易用和性能於一身。
 

    JDOM 和 DOM 在性能測試時表現不佳,在測試 10M 文檔時內存溢出。在小文檔情況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開發者已經說明他們期望在正式發行版前專注性能問題,但是從性能觀點來看,它確實沒有值得推薦之處。另外,DOM 仍是一個非常好的選擇。DOM 實現廣泛應用於多種編程語言。它還是許多其它與 XML 相關的標准的基礎,因為它正式獲得 W3C 推薦(與基於非標准的 Java 模型相對),所以在某些類型的項目中可能也需要它(如在 JavaScript 中使用 DOM)。 

  SAX表現較好,這要依賴於它特定的解析方式。一個 SAX 檢測即將到來的XML流,但並沒有載入到內存(當然當XML流被讀入時,會有部分文檔暫時隱藏在內存中)。 

  DOM4J,目前許多開源項目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置文件。如果不考慮可移植性,那就推薦采用DOM4J。


免責聲明!

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



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