2012-02-11 49 views
1

我是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; 
    } 
    

    }

回答

2

問題解決了!

貝婁是網站提供有用的信息:

我最初的問題是我應該如何定義類的數據我想從XML中提取。在瞭解了我應該怎麼做(查看JAVA編程的基本概念)後,我將ExampleHandler返回的數據類型更改爲ArrayList <「您想要返回的數據的類」>。

我在下面給出一個例子:一個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> 
    

所以在這裏,你應該定義一個類 「汽車」 與適當的屬性(字符串類型,型號,顏色,年;),制定者和獲得者...

  • 我對這個XML ExampleHandler的建議是:

公共類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)); 
    } 
} 

}

在此之後:

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

我希望這可以幫助別人。

注意:我沒有測試完全一樣,但幾乎是相同的我的解決辦法,所以應該工作...

而且我的英語不好對不起......

+1

歡迎棧溢出!您不應該僅僅給出另一個網站的鏈接作爲答案,因爲該網站將來可能會過時。相反,單擊此答案上的「編輯」鏈接,並在此處包含解決方案的主要部分。請參閱:http://meta.stackexchange.com/q/8259 – 2012-02-13 02:15:54

+0

已編輯;)我希望這種方式更好。 – amp 2012-02-14 17:18:33