[英]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.