Разбор XML-файла из сетевой базы данных в Android - PullRequest
0 голосов
/ 05 апреля 2011

Я пытаюсь проанализировать XML-файл с URL. Я нашел пример по следующей ссылке

http://www.anddev.org/parsing_xml_from_the_net_-_using_the_saxparser-t353.html
и попытался использовать его в моем коде, но он возвратил значения равными нулю

Ниже приведен мой код парсинга 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;
    }
}

Пожалуйста, скажите мне, где я получаю ошибку

1 Ответ

1 голос
/ 05 апреля 2011

Метод endElement запускается перед методом characters, поэтому ваши логические переменные всегда устанавливаются на false, когда метод characters запускается. Вы должны переместить некоторый код из endElement в characters, что-то вроде этого:

@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));
    }
}

Вам также следует взглянуть здесь для полного объяснения "Работа с XML на Android".

...