我是Android新手(也是Java),但現在我開始使用Web服務。使用SAXparser獲取信息到多個元素(Android)
因此,爲了更好地瞭解如何解析XML,我開始嘗試本教程:
http://www.anddev.org/novice-tutorials-f8/parsing-xml-from-the-net-using-the-saxparser-t353.html
與此示例中使用的XML:
<outertag>
<innertag sampleattribute="innertagAttribute">
<mytag>anddev.org rulez =)</mytag>
<tagwithnumber thenumber="1337"/>
</innertag>
</outertag>
我理解它是如何工作的(我猜),但如果XML是這樣的:
<outertag>
<innertag sampleattribute="innertagAttribute">
<mytag>anddev.org rulez =)</mytag>
<tagwithnumber thenumber="1337"/>
</innertag>
<innertag sampleattribute="innertagAttribute2">
<mytag>something</mytag>
<tagwithnumber thenumber="14214"/>
</innertag>
</outertag>
在應用程序的類中需要改變什麼來獲取各種元素的數據?
我明白任何sugestion ...
完整的源代碼:
ParseXML.java
包org.anddev.android.parsingxml;
import java.net.URL;
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource; import org.xml.sax.XMLReader;
import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView;
公共類ParsingXML延伸活動{
private final String MY_DEBUG_TAG = "WeatherForcaster"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); /* Create a new TextView to display the parsingresult later. */ TextView tv = new TextView(this); try { /* Create a URL we want to load some xml-data from. */ URL url = new URL("http://www.anddev.org/images/tut/basic/parsingxml/example.xml"); /* Get a SAXParser from the SAXPArserFactory. */ SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); /* Get the XMLReader of the SAXParser we created. */ XMLReader xr = sp.getXMLReader(); /* Create a new ContentHandler and apply it to the XML-Reader*/ ExampleHandler myExampleHandler = new ExampleHandler(); xr.setContentHandler(myExampleHandler); /* Parse the xml-data from our URL. */ xr.parse(new InputSource(url.openStream())); /* Parsing has finished. */ /* Our ExampleHandler now provides the parsed data to us. */ ParsedExampleDataSet parsedExampleDataSet = myExampleHandler.getParsedData(); /* Set the result to be displayed in our GUI. */ tv.setText(parsedExampleDataSet.toString()); } catch (Exception e) { /* Display any Error to the GUI. */ tv.setText("Error: " + e.getMessage()); Log.e(MY_DEBUG_TAG, "WeatherQueryError", e); } /* Display the TextView. */ this.setContentView(tv); }
}
ExampleHandler
包org.anddev.android.parsingxml;
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler;
公共類ExampleHandler延伸的DefaultHandler {
// =========================================================== // Fields // =========================================================== private boolean in_outertag = false; private boolean in_innertag = false; private boolean in_mytag = false; private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet(); // =========================================================== // Getter & Setter // =========================================================== public ParsedExampleDataSet getParsedData() { return this.myParsedExampleDataSet; } // =========================================================== // Methods // =========================================================== @Override public void startDocument() throws SAXException { this.myParsedExampleDataSet = new ParsedExampleDataSet(); } @Override public void endDocument() throws SAXException { // Nothing to do } /** Gets be called on opening tags like: * <tag> * Can provide attribute(s), when xml was like: * <tag attribute="attributeValue">*/ @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { if (localName.equals("outertag")) { this.in_outertag = true; }else if (localName.equals("innertag")) { this.in_innertag = true; }else if (localName.equals("mytag")) { this.in_mytag = true; }else if (localName.equals("tagwithnumber")) { // Extract an Attribute String attrValue = atts.getValue("thenumber"); int i = Integer.parseInt(attrValue); myParsedExampleDataSet.setExtractedInt(i); } } /** Gets be called on closing tags like: * </tag> */ @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if (localName.equals("outertag")) { this.in_outertag = false; }else if (localName.equals("innertag")) { this.in_innertag = false; }else if (localName.equals("mytag")) { this.in_mytag = false; }else if (localName.equals("tagwithnumber")) { // Nothing to do here } } /** Gets be called on the following structure: * <tag>characters</tag> */ @Override public void characters(char ch[], int start, int length) { if(this.in_mytag){ myParsedExampleDataSet.setExtractedString(new String(ch, start, length)); } }
}
ParsedExampleDataSet
包org.anddev.android。parsingxml;
public class ParsedExampleDataSet {0}私人String extractedString = null; private int extractedInt = 0;
public String getExtractedString() { return extractedString; } public void setExtractedString(String extractedString) { this.extractedString = extractedString; } public int getExtractedInt() { return extractedInt; } public void setExtractedInt(int extractedInt) { this.extractedInt = extractedInt; } public String toString(){ return "ExtractedString = " + this.extractedString + "nExtractedInt = " + this.extractedInt; }
}
歡迎棧溢出!您不應該僅僅給出另一個網站的鏈接作爲答案,因爲該網站將來可能會過時。相反,單擊此答案上的「編輯」鏈接,並在此處包含解決方案的主要部分。請參閱:http://meta.stackexchange.com/q/8259 – 2012-02-13 02:15:54
已編輯;)我希望這種方式更好。 – amp 2012-02-14 17:18:33