android - Ошибка XMLPullParser

у меня есть файл xml (локальный), который хранится в: /assets

Я использую XMLpulparser для анализа этого XML, но в моем LogCat у меня есть следующие проблемы:

введите здесь описание изображения

вот мой xml-файл:

<?xml version="1.0" encoding="utf-8"?>
<countries>
<country>
    <name>Iran</name>
    <phonecode>+98</phonecode>
    <code>IRI</code>
</country>
<country">
    <name>United State</name>
    <phonecode>+1</phonecode>
    <code>USA</code>
</country>


person kianm98    schedule 05.12.2013    source источник
comment
Вы используете dtd или что-то подобное?   -  person njzk2    schedule 05.12.2013


Ответы (3)


Это дает вам эту ошибку, потому что во втором начальном теге страны есть знак «. Также, похоже, отсутствует закрывающий тег страны в конце файла.

person Crazy Photon    schedule 05.12.2013

один из тегов вашей страны содержит символ ", что недопустимо в именах тегов xml.

Вы написали

    <country">
    ....
    </country>

ты должен написать

    <country>

    </country>
person Arshak92    schedule 05.12.2013

# Хотя у вас есть некоторые ошибки в XML-коде, которые вы можете проверить по приведенным выше ответам, идеальным способом анализа вашего XML-кода будет что-то вроде

Напр. Содержимое XML-файла (сохранено во внешнем хранилище как code.xml)

<?xml version="1.0" encoding="utf-8"?>
<countries>
<country>
 <name>Iran</name>
 <phonecode>+98</phonecode>
 <code>IRI</code>
</country>
<country>
 <name>United State</name>
 <phonecode>+1</phonecode>
 <code>USA</code>
</country>
</countries>

# Начнем синтаксический анализ

<сильный>1. Сначала создайте вспомогательный класс

package in.example.helpers;

import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;

public class XmlDataParseHelper {

private XmlPullParser parser;
private static final String NULL = null;

/**
 * 
 * @param in
 * @throws XmlPullParserException
 * @throws IOException
 * @throws IllegalArgumentException
 */
public XmlDataParseHelper(InputStream in) throws XmlPullParserException,
        IOException, IllegalArgumentException {
    try {
        parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in, null);
        parser.nextTag();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * 
 * @return XmlPullParser
 */
public XmlPullParser getParser() {
    return parser;
}

/**
 * 
 * @param parser
 * @param tag
 * @return String
 * @throws IOException
 * @throws XmlPullParserException
 */
public static String readTag(XmlPullParser parser, String tag)
        throws IOException, XmlPullParserException {
    String tagData = "";
    parser.require(XmlPullParser.START_TAG, NULL, tag);
    if (parser.next() == XmlPullParser.TEXT) {
        tagData = parser.getText();
        parser.nextTag();
    }
    parser.require(XmlPullParser.END_TAG, NULL, tag);
    return tagData;
}

/**
 * 
 * @param parser
 * @param tag
 * @param attributeName
 * @return String
 * @throws IOException
 * @throws XmlPullParserException
 */
public static String readAttribute(XmlPullParser parser, String tag,
        String attributeName) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, NULL, tag);
    String attributeData = parser.getAttributeValue(NULL, attributeName);
    parser.nextTag();
    parser.require(XmlPullParser.END_TAG, NULL, tag);
    return attributeData;
}

}

<сильный>2. Прочитать файл xml как

public InputStream readFile(String fileName) throws FileNotFoundException,
            IOException {
    //check external storage present
    // else throw new IOException();

    return new FileInputStream(Environment.getExternalStorageDirectory()
            + "/" + fileName);
}

<сильный>3. Передайте InputStream другому методу, который инициализирует объект XMLPullParser

public void readXmlFile(String fileName) {
     try {
        if (fileName.isEmpty())
        throw new NullPointerException();
        readData(new XmlDataParseHelper(readFile(fileName)).getParser());
     } catch (IOException e) {
           e.printStackTrace();
     } catch (XmlPullParserException e) {
           e.printStackTrace();
     } catch (IllegalArgumentException e) {
           e.printStackTrace();
     }
 }

<сильный>4. Наконец, проанализируйте объект XMLPullParser как

public void readData(XmlPullParser parser)
                throws XmlPullParserException, IOException {
    int eventType = parser.getEventType();
    String tagName = "";
    Log.w("Developer", "Reading file...");
    while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
            case XmlPullParser.START_DOCUMENT :
                Log.w("Developer", "Reading backup file...");
                break;
            case XmlPullParser.START_TAG :
                tagName = parser.getName();
                if (tagName.equals("countries")) {
                    Log.w("XMLParse", "Start TAG countries");
                    // do something when countries tag starts
                }
                if (tagName.equals("country")) {
                    Log.w("XMLParse", "Start TAG country");
                    // do some when country tag starts
                } else if (tagName.equals("name")) {
                    // read tag value using XmlDataParseHelper class
                    String countryName = XmlDataParseHelper.readTag(parser,
                                    "name");
                    Log.w("XmlParser", "Country name : "+countryName);
                } else if (tagName.equals("phonecode")) {
                    String countryPhoneCode = 
                                  XmlDataParseHelper.readTag(parser,"phonecode");
                    Log.w("XmlParser", "Country Phone code : "+countryPhoneCode);
                } else if (tagName.equals("code")) {
                    String countryCode = 
                                 XmlDataParseHelper.readTag(parser, "code");
                    Log.w("XmlParser", "Country code name : "+countryCode); 
                }
            break;
            case XmlPullParser.END_TAG :
                tagName = parser.getName();
                if (tagName.equals("countries")) {
                      // do something when counties tag is close.
                }           
            break;
        }
        eventType = parser.next();
    }
    Log.w("Developer", "File parsing complete...");
 }

Чтобы прочитать файл, просто вызовите метод readXmlFile(String fileName) в AsyncTask с именем файла, хранящегося во внешнем хранилище.

#I hope it helps you and others in the future.

Весь код рабочего примера Android находится здесь https://gist.github.com/rachitrm/7810837. или разветвить проект http://www.github.com/rachitrm/rm-xmlparser/

person Community    schedule 05.12.2013
comment
Спасибо за ответ, все в порядке, но я думаю, что ваш XmlDataParseHelper неверен, потому что, когда он хочет прочитать тег, он выдает исключение и не может прочитать содержимое тега (данные). не могли бы вы исправить это и отредактировать свой пост? Большое спасибо ! - person kianm98; 05.12.2013
comment
@kianm98 kianm98 хорошо, я использую вспомогательный класс в своем приложении, он работает хорошо :) надеюсь, где-то есть проблемы с логикой. - person Rachit Mishra; 05.12.2013
comment
@kianm98 kianm98 у меня есть ответ 0 ошибок теперь с исходным кодом проекта наслаждайтесь. - person Rachit Mishra; 05.12.2013
comment
Спасибо, ваш код на GitHub работал нормально, но я должен скопировать файл в ExtrenalDirectory телефона, но я хочу, чтобы мой файл был частным файлом, и я хочу прочитать свой XML-файл, который хранится в: '/assets' или '/res/xml / что я могу сделать для этого? - person kianm98; 06.12.2013
comment
Спасибо, ваш код на GitHub работал нормально, но я должен скопировать файл в ExtrenalDirectory телефона, но я хочу, чтобы мой файл был частным файлом, и я хочу прочитать свой XML-файл, который хранится в: '/assets' или '/res/xml / что я могу сделать для этого? - person kianm98; 06.12.2013
comment
Спасибо, ваш код на GitHub работал нормально, но я должен скопировать файл в ExtrenalDirectory телефона, но я хочу, чтобы мой файл был частным файлом, и я хочу прочитать свой XML-файл, который хранится в: '/assets' или '/res/xml / что я могу сделать для этого? @twntee - person kianm98; 06.12.2013
comment
@kianm98 измените путь к каталогу, добавьте filepath в эту строку return new FileInputStream(Environment.getExternalStorageDirectory() +YOUR_FILE_PATH+ "/" + fileName); - person Rachit Mishra; 06.12.2013