其他分享
首页 > 其他分享> > 使用SAXparser将信息获取多个元素(Android)

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

作者:互联网

我是Android(和Java)的新用户,但现在我开始使用Web服务.

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

包org.anddev.android.parsingxml;

导入java.net.URL;

导入javax.xml.parsers.SAXParser;
导入javax.xml.parsers.SAXParserFactory;

导入org.xml.sax.InputSource;
导入org.xml.sax.XMLReader;

导入android.app.Activity;
导入android.os.Bundle;
导入android.util.Log;
导入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

包org.anddev.android.parsingxml;

导入org.xml.sax.Attributes;
导入org.xml.sax.SAXException;
导入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;

公共类ParsedExampleDataSet {
    私有字符串extractString = null;
    私人诠释extractInt = 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;
}

}

解决方法:

问题解决了!

贝娄(Bellow)是包含有用信息的网站:

> https://stackoverflow.com/a/4828765
> https://stackoverflow.com/a/5709544
> http://as400samplecode.blogspot.com/2011/11/android-parse-xml-file-example-using.html
> http://www.anddev.org/novice-tutorials-f8/parsing-xml-from-the-net-using-the-saxparser-t353.html

我最初的问题是如何为要从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();
...

我希望这可以帮助别人.

注意:我没有完全像这样测试过,但与我的解决方案几乎相同,因此应该可以工作…

对不起,我英语不好…

标签:android,saxparser
来源: https://codeday.me/bug/20191009/1881171.html