XmlPullParser 从 START_DOCUMENT 跳到 END_DOCUMENT eventType
XmlPullParser skip from START_DOCUMENT to END_DOCUMENT eventType
我正在尝试解析 Android 应用程序中的 xml 文件。当我尝试处理它时,除了 START_DOCUMENT 和 END_DOCUMENT 之外,我没有在 START 后立即收到 eventType。看来我要传送空文件什么的。奇怪的是,我在 5 个不同的 xml 文件上尝试了这段代码,并且对于损坏的文件(缺少一些结束标记)它有效(有效我的意思是我得到了与 START 和 END 不同的事件类型)。我在想,也许我创建了错误的 xml 文件,但我什至下载了一些示例 xml 文件,但它也没有用。
一些代码:
public static void parseXML(Activity activity) throws XmlPullParserException, IOException {
XmlPullParserFactory parserFactory;
parserFactory = XmlPullParserFactory.newInstance();
parserFactory.setNamespaceAware(true);
XmlPullParser parser = parserFactory.newPullParser();
InputStream inputStream = activity.getAssets().open("XML_RENAME.xml");
InputStreamReader isReader = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(isReader);
parser.setInput(reader);
processParces(parser);
}
private static void processParces(XmlPullParser parser) throws XmlPullParserException, IOException {
int eventType = parser.getEventType();
String tagname = "";
String text = "";
while(eventType != XmlPullParser.END_DOCUMENT)
{
tagname = parser.getName();
switch(eventType)
{
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase(KEY_REGION)) {
}
break;
case XmlPullParser.TEXT:
//grab the current text so we can use it in END_TAG event
text = parser.getText();
Log.e("Text: ", text);
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase(KEY_SECTOR)) {
Log.e("XML ",KEY_SECTOR);
} else if (tagname.equalsIgnoreCase(KEY_DIRECTIONS)) {
Log.e("XML ",KEY_DIRECTIONS );
} else if (tagname.equalsIgnoreCase(KEY_CONDITIONS)) {
Log.e("XML ",KEY_CONDITIONS );
} else if (tagname.equalsIgnoreCase(KEY_NEIGHBORS)) {
Log.e("XML ",KEY_NEIGHBORS );
} else if (tagname.equalsIgnoreCase(KEY_CONTINUATIONS)) {
Log.e("XML ",KEY_CONTINUATIONS );
} else if (tagname.equalsIgnoreCase(KEY_BLOCKS)) {
Log.e("XML ",KEY_BLOCKS );
}
break;
default:
break;
}
eventType = parser.next();
}
}
我发现了一个问题。一些 xml 文件在开始时包含一些额外的字节,具体来说 "EF BB BF"。它称为 BOM (Byte-Order-Mark
)。当 xml 包含这些额外的字节时,我们的 XmlPullParser
无法正常工作并且表现得好像没有 START_TAG 事件并转到 END_DOCUMENT。
我正在尝试解析 Android 应用程序中的 xml 文件。当我尝试处理它时,除了 START_DOCUMENT 和 END_DOCUMENT 之外,我没有在 START 后立即收到 eventType。看来我要传送空文件什么的。奇怪的是,我在 5 个不同的 xml 文件上尝试了这段代码,并且对于损坏的文件(缺少一些结束标记)它有效(有效我的意思是我得到了与 START 和 END 不同的事件类型)。我在想,也许我创建了错误的 xml 文件,但我什至下载了一些示例 xml 文件,但它也没有用。
一些代码:
public static void parseXML(Activity activity) throws XmlPullParserException, IOException {
XmlPullParserFactory parserFactory;
parserFactory = XmlPullParserFactory.newInstance();
parserFactory.setNamespaceAware(true);
XmlPullParser parser = parserFactory.newPullParser();
InputStream inputStream = activity.getAssets().open("XML_RENAME.xml");
InputStreamReader isReader = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(isReader);
parser.setInput(reader);
processParces(parser);
}
private static void processParces(XmlPullParser parser) throws XmlPullParserException, IOException {
int eventType = parser.getEventType();
String tagname = "";
String text = "";
while(eventType != XmlPullParser.END_DOCUMENT)
{
tagname = parser.getName();
switch(eventType)
{
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase(KEY_REGION)) {
}
break;
case XmlPullParser.TEXT:
//grab the current text so we can use it in END_TAG event
text = parser.getText();
Log.e("Text: ", text);
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase(KEY_SECTOR)) {
Log.e("XML ",KEY_SECTOR);
} else if (tagname.equalsIgnoreCase(KEY_DIRECTIONS)) {
Log.e("XML ",KEY_DIRECTIONS );
} else if (tagname.equalsIgnoreCase(KEY_CONDITIONS)) {
Log.e("XML ",KEY_CONDITIONS );
} else if (tagname.equalsIgnoreCase(KEY_NEIGHBORS)) {
Log.e("XML ",KEY_NEIGHBORS );
} else if (tagname.equalsIgnoreCase(KEY_CONTINUATIONS)) {
Log.e("XML ",KEY_CONTINUATIONS );
} else if (tagname.equalsIgnoreCase(KEY_BLOCKS)) {
Log.e("XML ",KEY_BLOCKS );
}
break;
default:
break;
}
eventType = parser.next();
}
}
我发现了一个问题。一些 xml 文件在开始时包含一些额外的字节,具体来说 "EF BB BF"。它称为 BOM (Byte-Order-Mark
)。当 xml 包含这些额外的字节时,我们的 XmlPullParser
无法正常工作并且表现得好像没有 START_TAG 事件并转到 END_DOCUMENT。