簡體   English   中英

Android中的SAX XML解析

[英]SAX XML Parsing in android

XML代碼是

  <?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>

僅當您確實有特殊目的時,我才不會將它們保存在向量中。 我會將它們保存在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將在每個大綱標簽中保存屬性。 之所以定義String key是因為我們需要它來獲取鍵並為每個outlineData正確設置它們。

如您所見,總是以這種方式在startDocument()方法中聲明outlineMap,我們確保每次使用此處理程序進行解析時,您都會有一個空的新HashMap。

startElement()方法中,我們在忽略大小寫的情況下檢查標簽的合格名稱是否等於OUTLINE 如果出現此標簽,我們將聲明一個新的HashMap,以便我們可以保存每個大綱標簽的每個屬性集。 然后,我們通過解析outline標簽的屬性鍵的鍵值,為鍵字符串分配一個值。 然后,使用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

當然,還有其他幾種可用的方法,但是對於您來說,這種方法現在更有趣。 對於您的實際需求,字符方法可能沒有那么有趣。

希望對您有所幫助。 如果您需要了解更多信息,請發表評論。

這是通用xml解析器

轉到鏈接http://androidosbeginning.blogspot.com/2010/09/generic-xml-parsing-in-android.html

希望這能解決您面臨的問題。

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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM