2012-01-08 58 views
0

使用:XML解析包括在線分析

import org.w3c.dom.*; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.DocumentBuilder; 

我怎麼能提取XML數據?例如對於此xml文件:

<request method="POST" url="/devices/test/planner" body="*"> 
    <response statusCode="200"> 
    <header> 
     <headerParameters> 
     <headerParameter name="Content-Type">Content-Type=application/xml</headerParameter> 
     </headerParameters> 
    </header> 
    <body>booking created!</body> 
    </response> 
</request> 

我該如何提取數據? 另外我怎樣才能從內聯行提取數據?

<request method="POST" url="/devices/test/planner" body="*"> 

謝謝?

+3

你有沒有嘗試什麼嗎? – home 2012-01-08 20:02:26

+0

你到目前爲止嘗試過什麼?你剛剛說過你打算使用哪些課程。而「內聯行中的數據」是什麼意思? – dty 2012-01-08 20:02:59

+0

我試着用tutoriels上的一些libreries,但只設法得到部分解析。在每一個導師他們使用不同的庫,我不能得到涵蓋我所需要的一個(或者propably我不能找出我可以使用的api工具) – 2012-01-08 20:07:42

回答

2

我第二次推薦使用XPath。你可以手動遍歷DOM,但爲什麼? XPath旨在解決此問題。下面是一個完整的Java/JAXP/XPath的例子(SANS錯誤檢查和異常處理):

import java.io.IOException; 
import java.io.StringReader; 
import javax.xml.parsers.*; 
import javax.xml.xpath.*; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 

public class Xpather { 
    public static void main(String[] args) 
      throws XPathExpressionException, ParserConfigurationException, 
      SAXException, IOException { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(new InputSource("workbook.xml")); 
     XPath xpath = XPathFactory.newInstance().newXPath(); 
     Node body = (Node) xpath.evaluate("/request/response/body", doc, 
       XPathConstants.NODE); 
     System.out.println(body.getTextContent()); 
     Node url = (Node) xpath.evaluate("/request/@url", doc, 
       XPathConstants.NODE); 
     System.out.println(url.getNodeValue()); 
    } 
} 

此代碼打印body元素和request元素的url屬性值的內容。

輸出:

預訂創建!

/設備/測試/規劃

1

使用XPath - 也容易通過standard Java APIs獲得。一旦你有了Document,Java的XPath就可以直接評估它 - 所以你的DocumentBuilder等仍然會被使用。

例如,您可以使用/request/@url之類的內容獲取<request/>元素,使用/request或請求的URL。

另一種方法 - 特別是對於可能在同一模式下處理多個文檔的高性能使用場景 - 是使用SAX解析,而不是每個處理的XML元素都會收到一個事件,並給出它的名稱和屬性列表。

+2

現在,StAX是在附近,可能非常少的用例SAX會是一個更好的選擇。 (這也是一個非常模糊的建議。) – millimoose 2012-01-08 21:26:17