2009-11-12 65 views
2
<?xml version="1.0" ?> 
<input> 
    <sys> 
     <protocol>TL1</protocol> 
     <ipAddress>10.05.2.3</ipAddress> 
     <port>2001</port> 
     <prompt>agent</prompt>  
     <TL1Command> 
      <type>get</type> 
      <command_code>...........</command_code> 
      <staging_block>  
       <tid>...........</tid> 
       <aid>...........</aid> 
       <ctag>..........</ctag> 
       <gen_block>.....</gen_block> 
      </staging_block> 
      <payload_block> 
       <data_block>.......</data_block> 
      </payload_block> 
    </TL1Command> 
    </sys> 
    <sys> 
     <protocol>TL1</protocol> 
     <ipAddress>10.5.2.98</ipAddress> 
     <port>2001</port> 
     <prompt>agent</prompt>  
     <TL1Command> 
      <type>get</type> 
      <command_code>...........</command_code> 
      <staging_block>  
       <tid>...........</tid> 
       <aid>...........</aid> 
       <ctag>..........</ctag> 
       <gen_block>.....</gen_block> 
      </staging_block> 
      <payload_block> 
       <data_block>.......</data_block> 
       <data_block>.......</data_block> 
       <data_block>.......</data_block> 
      </payload_block> 
    </TL1Command> 
    </sys> 
</input> 

我想知道如何使用Java來解析這個XML。這樣我就可以像我的程序一樣使用這些數據。我知道如何解析它,但問題是每個命令可能有不同數量的數據塊。所以在解析之後,我需要爲各個命令使用各自的數據塊。我的意思是第一個命令,而回顧時,我應該只得到一個數據塊值和第二個命令3個數據塊等。請讓我知道解決此問題的任何示例代碼。如何使用Java解析XML?

+0

您嘗試了哪些解析器?我不明白你是如何使用數據的 – Mark 2009-11-12 13:25:10

+0

我真的很喜歡JIBX(http://jibx.sourceforge.net/),這要感謝stackoverflow.com :) – Trick 2009-11-12 17:25:25

回答

11

有來解析XML兩種基本方法。

  1. 基於遊標(StAX)或事件(SAX)的方法。更輕量但通常更冗長。當你只想抓取小零件或加工很簡單時,這是特別好的;和
  2. 基於樹的方法(DOM)。通常,DOM解析器是建立在SAX/StAX解析器之上的。他們需要更多的處理,並且通常需要您在執行任何操作之前將整個文檔存儲在內存中(而SAX/StAX可以更有效且更快速地響應)。但是這對於隨機訪問文件部分很有用。

選擇哪種是最適合你的情況。

+1

另一個開源的xml解析器是vtd-xml,這被認爲比DOM,SAX和Pull更高級一些 – 2009-11-23 02:32:05

0

正如克萊描述,你有基於事件的方法或之間進行選擇DOM樹必須遍歷。考慮基於事件的場景作爲某種狀態機,當你輸入元素「payload_block」時,你設置了一個相應的屬性,只要它被設置並且來自「data_block」的事件進來,你就會讀它們很長時間作爲來自playload_block的關閉事件。

當你遍歷樹,you'll讀「payload_block」的孩子,希望你可以遍歷並收集數據的列表。

0

很難說實際的問題。爲了簡單起見,我會構建一個DOM樹並從該結構中讀取數據。

爲TL1Command一個典型的類,然後可能看起來像:

class TL1Command { 
    String type; 
    String commandLine; 
    StagingBlock stagingBlock; 
    List<DataBlock> dataBlocks; 
} 

這種結構具有足夠的靈活性來處理每個TL1Command數據塊個數不同。 (是,這個問題?)

2

最簡單的方法是將文件加載的DOM文檔

然後得到你需要使用什麼樣的XPath

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream); 

NodeList nodeList = XPathAPI.selectNodeList(document, "/sys"); 
for (int i = 0; i < nodeList.getLength(); i++) { 
    Node node = nodeList.item(i); 
    System.out.println(node.getTextContent()); 
} 

退房的XPath教程here

0

我真的很喜歡(和它只是我的意見)的SAX方法,當你知道你的良好的files.Here結構是一個鏈接,可以幫助您SAX2 Tutorial

0

如果你只需要得到XML代碼片段進出對象圖,那麼你可能會考慮XStream這是一個簡單的輕量級編組/解編庫。

0

你可能也想知道vtd-xml,另一個開源XML解析/索引LIB ...

1

兼用DOM(文檔對象模型)解析器或SAX(簡單API for XML)解析器來解析您的xml文檔。 首先創建一個xml文檔。 (帶有擴展名爲.xml文件) 從鏈接http://archive.apache.org/dist/xml/xerces-j/ 下載解析器和解析文檔

0

我寫了一個非常簡單的API正是這個原因。它使用下面的DOM解析器,但公開了一個非常簡單且易於使用的API,它可以讓您輕鬆獲取XML數據。它只是一個單獨的Java文件,您可以在代碼中用作庫。希望有所幫助。

http://argonrain.wordpress.com/2009/10/27/000/