2012-03-07 135 views
-1

我解析XML有不同的tags.Below是我想解析的xml,我想要的是,在主數據存儲在單獨的數據結構和數據在二級標籤存儲在不同的數據結構。任何人都可以幫助。提前感謝。使用sax解析器解析xml具有不同的標籤

<Alerts> 
    <Secondary> 
    <FIRST_NAME>aaa</FIRST_NAME> 
    <EquicomAlerts> 
     <channelAlertStates> 
     <alertStates channel="ONLINE"> 
      <state name="CREATED" date="2012-01-11" /> 
     </alertStates> 
     </channelAlertStates> 
    </EquicomAlerts> 
    </Secondary> 
    <Primary> 
    <FIRST_NAME>bbb</FIRST_NAME> 
    <EquicomAlerts> 
     <channelAlertStates> 
     <alertStates channel="OffLINE"> 
      <state name="Destroyed" date="2012-01-11" /> 
     </alertStates> 
     </channelAlertStates> 
    </EquicomAlerts> 
    </Primary> 
</Alerts> 
+0

爲什麼投下來? – Rookie 2012-03-07 13:31:18

+0

你的困難並不那麼明顯,所以我假設你之前沒有使用過SAX。我發佈了一個答案 - 希望它現場。 – RonK 2012-03-07 13:44:54

+0

當你說「我有問題」時,你應該更具體一些。什麼樣的問題?你使用的是什麼版本的Java?你看到異常嗎?如果你這樣做,通過一切手段與我們分享...你需要從你的XML的具體數據?一個對象模型?我敢打賭,有很多人願意提供幫助,但首先我們需要了解你的問題是什麼...... – jambriz 2012-03-07 20:15:46

回答

2

當使用SAX解析XML時,您需要實現一個ContentHandler。 當解析器擊中XML中的任何節點時,ContentHandler會獲取事件。

您需要查看何時獲取啓動Primary元素的事件,並將解析器找到的所有內容放入適當的數據結構中。

一旦您收到解析器通知Secondary元素開始 - 您應該切換到第二個數據結構。

您應該閱讀一些關於SAX解析器的知識,以瞭解如何正確實現它。

如果你的文檔不是太大 - 我推薦使用DOM來代替,它會更容易實現。

編輯: 我從我的電話回答,所以請原諒任何錯誤。

SAX是一種解析XML的事件驅動方式。
您將需要實施方法,如startElement,endElementreadCharacters(可能是最後一個錯誤的名稱)。這些都是有目的的 - 你應該閱讀它們。基本上你的內容處理程序需要接收這些事件並相應地處理數據的讀取。

嘗試編寫一個示例內容處理程序並進行調試以瞭解其工作原理 - 這是我可以給你的最佳建議。

+0

嘿,你能幫助我嗎?我不知道該怎麼做。 – Rookie 2012-03-07 13:55:11

1

我在問題中看不到任何問題。如果你知道如何使用Java來解析xml,那麼你所要求的很容易實現。基於標籤名稱,您需要填充您選擇的數據結構。下面的代碼可能不是最優的,但工作。有許多xml-to-java綁定框架,比如jaxb,castor,xmlbeans等。你可以使用其中的任何一個來簡化你的生活。您也可以使用xpath api進行解析。

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

public class ExampleDOMParser { 


    public static void main(String args[]) { 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     try { 

      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document dom = db.parse("test.xml"); //Feed your XML.. 

      Node rootNode = dom.getChildNodes().item(0); 
      NodeList nodeList = rootNode.getChildNodes(); 
      for(int i=0;i < nodeList.getLength();i++){ 
       System.out.println(nodeList.item(i).getNodeName()); 
       Node childNode = nodeList.item(i); 

       if(childNode.getNodeType() != Node.TEXT_NODE && 
         childNode.getNodeName().equals("Secondary")){ 
        // TODO: Drill down using DOM API to populate your datastructure 
       } 
       else if(childNode.getNodeType() != Node.TEXT_NODE && 
         childNode.getNodeName().equals("Primary")){ 
        //TODO: Drill down using DOM API to populate your datastructure 
       } 

      } 

     } catch (ParserConfigurationException pce) { 
      pce.printStackTrace(); 
     } catch (SAXException se) { 
      se.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 
} 
1

你寫一個XSLT通過它可以把輸入的XML數據轉換成單獨的結構按照您的要求,並通過XSLT解析XML是很容易