2010-09-23 125 views
2

XML代碼SAX解析XML Android中

<?xml version="1.0" encoding="UTF-8" ?> 
    <opml version="1"> 
    <head> 
    <title>Radio</title> 
    <status>200</status> 
    </head> 
    <body> 
    <outline type="link" text="Local" URL="http://..............." key="local" /> 
    <outline type="link" text="Music" URL="http://.............." key="music" /> 
    <outline type="link" text="walk" URL="http://...................." key="walk" /> 
    <outline type="link" text="Sports" URL="http://..........." key="sports" /> 
    <outline type="link" text="Place" URL="http://..............." key="Place" /> 
    <outline type="link" text="Verbal" URL="http://............." key="Verbal" /> 
    <outline type="link" text="Podcasts" URL="http://....................." key="podcast" /> 
    </body> 
    </opml> 

回答

5

我不會將它們保存在一個向量中,只有當你真的需要特殊目的。我會將它們保存在HashMap中,以便您可以通過它們的鍵來引用它們。

我需要查看您的XML結構以幫助您獲得深入的答案。

編輯:這是你的答案。晚但仍然。

鑑於您的XML結構如下所示。

<?xml version="1.0" encoding="UTF-8" ?> 
<opml version="1"> 
    <head> 
     <title>Radio</title> 
    </head> 
    <body> 
     <outline type="link" text="Local" URL="http://google.at" key="local" /> 
     <outline type="link" text="Music" URL="http://google.at" key="music" /> 
     <outline type="link" text="walk" URL="http://google.at" key="walk" /> 
     <outline type="link" text="Sports" URL="http://google.at" key="sports" /> 
     <outline type="link" text="Place" URL="http://google.at" key="Place" /> 
     <outline type="link" text="Verbal" URL="http://google.at" key="Verbal" /> 
     <outline type="link" text="Podcasts" URL="http://google.at" key="podcast" /> 
    </body> 
</opml> 

要得到所有你需要解析成有用HashMap處理程序可能看起來像這樣的數據。

import java.util.HashMap; 

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

public class MyContentHandler extends DefaultHandler { 

    private HashMap<String, Object> outlineMap; 
    private HashMap<String, String> outlineData; 
    private String key; 

    public void startDocument() throws SAXException { 
     outlineMap = new HashMap<String, Object>(); 
    } 

    public void endDocument() throws SAXException { 
     AnotherClass.setHashMap(outlineMap); 
    } 

    public void startElement(String uri, String localName, String qName, 
     Attributes atts) throws SAXException { 
     if(qName.equalsIgnoreCase("OUTLINE")) { 
      outlineData = new HashMap<String, String>(); 
      key = atts.getValue("key"); 
      outlineData.put("type", atts.getValue("type")); 
      outlineData.put("text", atts.getValue("text")); 
      outlineData.put("URL", atts.getValue("URL")); 
     } 
    } 

    public void endElement(String uri, String localName, String qName) 
    throws SAXException { 
     if(qName.equalsIgnoreCase("OUTLINE")) { 
      outlineMap.put(key, outlineData); 
     } 
    } 
} 

HashMap中outlineMap將持有所有大綱條目和HashMap的outlineData將持有的每一個大綱標籤的屬性。字符串key的定義是因爲我們需要它來獲取鍵併爲每個outlineData正確設置它們。

正如你所看到的outlineMap總是在startDocument()方法中聲明這樣我們確保每次你使用這個處理程序解析你將有一個空的新的HashMap。

startElement()方法中,我們檢查標籤的限定名稱是否等於OUTLINE而忽略它的大小寫。如果出現這個標籤,我們會聲明一個新的HashMap,這樣我們可以保存每個大綱標籤的每個屬性集合。然後我們通過解析大綱標籤的屬性鍵的鍵值來爲我們的鍵字符串賦值。然後我們使用put()方法將其他所有有趣的屬性傳遞給我們的outlineData HashMap。這個方法只接受一個字符串作爲鍵和一個字符串作爲我們定義的值。

現在我們繼續討論我們的endElement()方法,該方法還會檢查OUTLINE再次忽略該情況的發生。如果發生這種情況,我們通過將前面的鍵字符串設置爲鍵並將outlineData HashMap設置爲值來設置第一個outlineMap條目的內容。這裏我們的HashMap接受一個字符串作爲它的鍵值和一個對象作爲它的值(它接受幾乎所有的值,因爲Java中的所有東西都是一個實際的對象)。

現在你已經準備好使用填充解析數據的HashMap了。

在我的示例中,我將最終的HashMap outlineMap傳遞給endDocument()方法中另一個類的setter。這意味着解析完成。

下面是SAX解析器如何使用這種方法的簡短說明,以便您更好地瞭解發生了什麼。

ON DOCUMENT START 
    startDocument() gets called 

ON STARTING TAG : <TAG> or <TAG attribute="123"> 
    startElement() gets called when a starting tag appears. 
    here you can decide which tag to look at and which attributes 
    to parse. 

ON INNERTAG DATA : DATA 
    characters() gets called building a char array of characters. 

ON END TAG : </TAG> 
    endElement() gets called when the ending tag appears. 

ON DOCUMENT END 
    endDocument() gets called 

當然,還有其他幾種方法可用,但對您而言,這種方法現在是更有趣的方法。字符方法可能對您的實際需要沒有那麼有趣。

我希望它有幫助。如果你需要了解更多,只需要點評。

+0

XML代碼是 <?XML版本= 「1.0」 編碼= 「UTF-8」?> 無線電 <輪廓類型= 「鏈接」 text =「Local」URL =「http://」key =「local」/> < outline =「link」text =「walk」URL =「http:// ...」key =「walk」/> kites 2010-09-24 05:28:47

+0

@Octavian:+1我一直在試圖找出一種將泛型SAX解析成HashMap幾天的方法。它不像上面的示例代碼,但是這足以讓我知道從哪裏開始。謝謝。 – Squonk 2011-12-23 09:50:03

-1

SAX: 簡單的xml解析。 它逐節點解析 遍歷從上到下 低內存使用率 使用sax不能返回導航。

//implementing required handlers 
public class SaxParse extends DefaultHandler{  }  
//new instance of saxParserFactory  
SAXParserFactory factory=SAXParserFactory.newInstance(); 
//NEW INSTANCE OF SAX PARSER  
SAXParser saxparser=factory.newSAXParser();  
//Parsing xml document 
SAXParser.parse(new File(file to be parsed), new SAXXMLParserImpl());