我尝试从Android设备解析XML时遇到了一个奇怪的错误。奇怪的是,几天前解析xml的工作并没有触及代码。今天,加载xml将无法正常工作。
xml文件位于项目目录的“assets”文件夹中。
以下是我将特定xml文件的路径传递给名为MazeFileReader
的解析器的部分。
private void generateFromFile() {
Log.v(TAG, "Generating from file");
File maze_file = new File(getCacheDir() + "/" + pregen_maze);
if (!maze_file.exists()) try {
InputStream is = getAssets().open(pregen_maze);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
FileOutputStream fos = new FileOutputStream(maze_file);
fos.write(buffer);
fos.close();
} catch (Exception e) { throw new RuntimeException(e); }
MazeFileReader mazeFileReader = new MazeFileReader(getApplicationContext(), maze_file.getPath());
现在MazeFileReader
正在采用该路径并尝试解析它。
private void load(String filename)
{
try{
File fXmlFile = new File(filename);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile); //Fails here
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("Maze");
for (int temp = 0 ; temp < nList.getLength() ; temp++) {
...
}
}
catch (Exception e) {
e.printStackTrace();
我已经跟踪了错误,似乎这行代码在DocumentBuilderImpl
if (parser.nextToken() == XmlPullParser.END_DOCUMENT) {
throw new SAXParseException("Unexpected end of document", null);
}
另外,我认为我的xml文件没有任何问题,因为我没有碰过它,而且它在几天前就已经开始工作了。我有4或5个其他xml文件已经全部工作,但今天,由于某种原因,所有文件都会遇到相同的SAXParseException
。 SAXParseException
的可能原因是什么?是否有可能xml的文件路径不正确?
这是有问题的xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Maze>
<sizeX>
4
</sizeX>
<sizeY>
4
</sizeY>
<roomNum>
0
</roomNum>
<partiters>
60
</partiters>
<cell_0>
173
</cell_0>
<cell_1>
132
</cell_1>
<cell_2>
140
</cell_2>
<cell_3>
198
</cell_3>
</Maze>
编辑:我发现了一些东西。我检查了我的项目的旧版本,它仍然无法正常工作。然后我制作了一个新的模拟器并重新安装了该应用程序。现在它有效!!!这背后的原因是什么?
我发现了别的东西。如果我调试并逐步解析,xml文件将运行到SAXParserException
。然后该文件将无法解析。但是,如果我不调试它并在新设备上重新安装应用程序,则xml会正确解析。顺便说一下,xml位于assets
文件夹中。为什么Android表现出这种行为? xml文件是否以某种方式被破坏了?