0

URL から xml ファイルを解析しようとしています。次のリンクで例を見つけました

http://www.anddev.org/parsing_xml_from_the_net_-_using_the_saxparser-t353.html
私のコードでそれを使用しようとしましたが、値がnullとして返されました

以下は、xmlを解析する私のコードです

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

    URL url = new URL("http://www.siva.com/search");

    /** Handling XML */
    SAXParserFactory saxparserfactory = SAXParserFactory.newInstance();
    SAXParser saxparser = saxparserfactory.newSAXParser();
    XMLReader xmlreader = saxparser.getXMLReader();

    /* Create a new ContentHandler and apply it to the XML-Reader*/
    ForListXMLHandler forlistmyhandler = new ForListXMLHandler();
    xmlreader.setContentHandler(forlistmyhandler);

    /* Parse the xml-data from our URL. */
    xmlreader.parse(new InputSource(url.openStream()));
    /* Parsing has finished. */

    /* Our ExampleHandler now provides the parsed data to us. */
    ParsedDataSet parsedDataSet = forlistmyhandler.getParsedData();
    System.out.println(parsedDataSet.toString());
}

以下はMyXMLhandlerのコードです

public class ForListXMLHandler extends DefaultHandler {
    private boolean in_outertag = false;
    private boolean in_innertag = false;
    private boolean in_First_name = false;
    private boolean in_Last_name = false;

    private ParsedDataSet myParsedDataSet = new ParsedDataSet();

    public ParsedDataSet getParsedData() {
        return this.myParsedDataSet;
    }

    @Override
    public void startDocument() throws SAXException {
        this.myParsedDataSet = new ParsedDataSet();
    }

    @Override
    public void endDocument() throws SAXException {
        // Nothing to do
    }

    public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
        if (localName.equals("Searchdata")) {
            this.in_outertag = true;
        } else if (localName.equals("Searchdata")) {
            this.in_innertag = true;
        } else if (localName.equals("First_name")) {
            this.in_First_name = true;
        } else if (localName.equals("Last_name")) {
            this.in_Last_name = true;
        }
    }

    /**
     * Gets be called on closing tags like:
     * */
    @Override
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
        if (localName.equals("Searchdata")) {
            this.in_outertag = false;
        } else if (localName.equals("Searchdata")) {
            this.in_innertag = false;
        } else if (localName.equals("First_name")) {
            this.in_First_name = false;
        } else if (localName.equals("Last_name")) {
            // Nothing to do here
        }
    }

    /**
     * Gets be called on the following structure: characters
     */
    @Override
    public void characters(char ch[], int start, int length) {
        if (this.in_First_name) {
            myParsedDataSet.setfirstname(new String(ch, start, length));
        }
        if (this.in_Last_name) {
            myParsedDataSet.setlastname(new String(ch, start, length));
        }
    }
}

次の部分は私の解析済みデータセットクラスです

public class ParsedDataSet {
    private String First_name = null;
    private String Last_name = null;

    public String getFirstname() {
        return First_name;
    }

    public void setfirstname(String First_name) {
        this.First_name = First_name;
    }

    public String getlastname() {
        return Last_name;
    }

    public void setlastname(String Last_name) {
        this.Last_name = Last_name;
    }

    public String toString() {
        return this.First_name + "n" + this.Last_name;
    }
}

どこでエラーが発生したか教えてください

4

1 に答える 1

1

メソッドはメソッドのendElement前に起動されるため、メソッドが起動されるcharactersと、ブール変数は常に に設定されます。次のように、一部のコードを から に移動する必要があります。falsecharactersendElementcharacters

@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {

}

@Override
public void characters(char ch[], int start, int length) {
    if (this.in_First_name) {
        this.in_First_name = false;
        myParsedDataSet.setfirstname(new String(ch, start, length));
    }
    if (this.in_Last_name) {
       this.in_Last_name = false;
       myParsedDataSet.setlastname(new String(ch, start, length));
    }
}

「Android での XML の操作」に関する完全な説明については、こちらも参照してください。

于 2011-04-05T13:03:06.383 に答える