使用SAXparser获取多个元素的信息(Android)

时间:2012-02-11 21:48:33

标签: android saxparser

我是Android的新手(也是Java版),但现在我开始使用网络服务了。

为了更好地理解如何解析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>

需要在应用程序的类中更改哪些内容才能获取各种元素的数据?

我感激任何消化......

完整源代码:

  • ParseXML.java

    package 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扩展了Activity {

    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

    package org.anddev.android.parsingxml;

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

    public class 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

    package org.anddev.android.parsingxml;

    public class ParsedExampleDataSet {     private 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;
    }
    

    }

1 个答案:

答案 0 :(得分:2)

问题解决了!

Bellow是包含有用信息的网站:

我最初的问题是我应该如何定义我想从XML中提取的数据的类。在我弄清楚如何执行此操作(查看JAVA编程的基本概念)之后,我将ExampleHandler返回的数据类型更改为ArrayList&lt;“要返回的数据类”&gt;。

我举一个例子:

  • 您要解析的XML示例:

    <outertag>
    <cartag type="Audi">
        <itemtag name="model">A4</itemtag>
        <itemtag name="color">Black</itemtag>
        <itemtag name="year">2005</itemtag>
    </cartag>
    <cartag type="Honda">
        <itemtag name="model">Civic</itemtag>
        <itemtag name="color">Red</itemtag>
        <itemtag name="year">2001</itemtag>
     </cartag>
     <cartag type="Seat">
        <itemtag name="model">Leon</itemtag>
        <itemtag name="color">White</itemtag>
        <itemtag name="year">2009</itemtag>
     </cartag>
     </outertag>
    

所以在这里你应该定义一个具有适当属性的类“car”(字符串类型,模型,颜色,年份;),setter和getters ......

  • 我对此XML的ExampleHandler的建议是:

public class ExampleHandler扩展了DefaultHandler {

// ===========================================================
// Fields
// ===========================================================

private int numberOfItems=3;    
private boolean in_outertag = false;
private boolean in_cartag = false;
private boolean[] in_itemtag = new boolean[numberOfItems];

Car newCar = new Car(); 

private ArrayList<Car> list = new ArrayList<Car>(); 

// ===========================================================
// Getter & Setter
// ===========================================================

public ArrayList<Car> getParsedData() {
    return this.list;
}

// ===========================================================
// Methods
// ===========================================================
@Override
public void startDocument() throws SAXException {
    this.list = new ArrayList<Car>();
}

@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("cartag")) {
        this.in_cartag = true;
        newCar.setType(atts.getValue("type"));  //setType(...) is the setter defined in car class
    }else if (localName.equals("itemtag")) {
        if((atts.getValue("name")).equals("model")){
            this.in_itemtag[0] = true;
        }else if((atts.getValue("name")).equals("color")){
            this.in_itemtag[1] = true;
        }else if((atts.getValue("name")).equals("year")){
            this.in_itemtag[2] = true;
        }
    }
}

/** 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("cartag")) {
        this.in_cartag = false;
        Car carTemp = new Car();
        carTemp.copy(newCar, carTemp);  //this method is defined on car class, and is used to copy the
                                        //properties of the car to another Object car to be added to the list
        list.add(carTemp);
    }else if (localName.equals("itemtag")){
        if(in_itemtag[0]){
            this.in_itemtag[0] = false;
        }else if(in_itemtag[1]){
            this.in_itemtag[1] = false;
        }else if(in_itemtag[2]){
            this.in_itemtag[2] = false;
        }
    }
}

/** Gets be called on the following structure: 
 * <tag>characters</tag> */
@Override
public void characters(char ch[], int start, int length) {

    if(in_itemtag[0]){
        newCar.setModel(new String(ch, start, length));
    }else if(in_itemtag[1]){
        newCar.setColor(new String(ch, start, length));
    }else if(in_itemtag[2]){
        newCar.setYear(new String(ch, start, length));
    }
}

}

在此之后,您可以使用以下命令获取Activity中的已解析数据:

...
ArrayList<Car> ParsedData = myExampleHandler.getParsedData();
...

我希望这有助于某人。

注意:我没有完全像这样的测试,但几乎与我的解决方案相同,所以它应该工作...

抱歉我的英语不好......