我在使用 SAX 解析器解析不同 Android 版本上的非常简单的 XML 文件时遇到问题。
使用带有 Android 2.3.3 的 Motorola XT316 代码可以正常工作。我可以看到它出现在所有标签上。但当使用 Android 2.1 的 PanDigital 时,代码不起作用。它可以正确打开 XML 文件,但不会输入任何标签。
解析器的代码:
public MyParser(Context context ) {
super();
theContext=context;
getData();
}
//start of the XML document
@Override
public void startDocument () {
Log.d("DataHandler", "Start of XML document");
}
//end of the XML document
@Override
public void endDocument () { Log.d("DataHandler", "End of XML document"); }
//opening element tag
@Override
public void startElement (String uri, String name, String qName, Attributes atts)
{
if(qName.equals("ARQUIVO"))
{
Log.d("DataHandler", "Start of ARQUIVO");
}
}
//closing element tag
@Override
public void endElement (String uri, String name, String qName)
{
if(qName.equals("ARQUIVO"))
{
Log.d("DataHandler", "End of ARQUIVO");
}
}
//element content
public void characters (char ch[], int start, int length)
{
}
public void getData()
{
//take care of SAX, input and parsing errors
try
{
//set the parsing driver
System.setProperty("org.xml.sax.driver","org.xmlpull.v1.sax2.Driver");
//create a parser
SAXParserFactory parseFactory = SAXParserFactory.newInstance();
parseFactory.setNamespaceAware(true);
SAXParser xmlParser = parseFactory.newSAXParser();
//get an XML reader
XMLReader xmlIn = xmlParser.getXMLReader();
//instruct the app to use this object as the handler
xmlIn.setContentHandler(this);
InputStreamReader xmlStream = new InputStreamReader(theContext.getResources().openRawResource(R.raw.arquivos));
//build a buffered reader
BufferedReader xmlBuff = new BufferedReader(xmlStream);
xmlIn.parse(new InputSource(xmlBuff));
}
catch(SAXException se) {
Log.e("AndroidTestsActivity","SAX Error " + se.getMessage());
}
catch(IOException ie) {
Log.e("AndroidTestsActivity","Input Error " + ie.getMessage());
}
catch(Exception oe) {
Log.e("AndroidTestsActivity","Unspecified Error " + oe.getMessage());
}
}
}
XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<ARQUIVOS>
<ARQUIVO
arquivo_caminho="http://192.168.0.60:8099/screen.xml"
arquivo_nome="screen.xml" />
<ARQUIVO
arquivo_caminho="http://192.168.0.60:8099/Images/T_0.png"
arquivo_nome="T_0.png" />
<ARQUIVO
arquivo_caminho="http://192.168.0.60:8099/Images/T_1.png"
arquivo_nome="T_1.png" />
<ARQUIVO
arquivo_caminho="http://192.168.0.60:8099/Images/T_2.png"
arquivo_nome="T_2.png" />
<ARQUIVO
arquivo_caminho="http://192.168.0.60:8099/Images/T_3.png"
arquivo_nome="T_3.png" />
<ARQUIVO
arquivo_caminho="http://192.168.0.60:8099/Images/T_4.png"
arquivo_nome="T_4.png" />
</ARQUIVOS>
我可以看到它显示消息“XML 文档开始”和“XML 文档结束”,但没有显示它们之间的消息“ARQUIVO 开始”和“ARQUIVO 结束”。
我不知道为什么会发生这种情况,也无法修复它。任何帮助将不胜感激。
提前致谢。
最佳答案
此链接帮助我解决了问题 code.google.com/p/android/issues/detail?id=11223
显然,android 2.1 和更新版本之间的 SAX 解析器功能存在差异。它将元素的标签放在不同的参数上。我不知道这是否是一个错误,但看起来确实是一个错误。
使其工作的方法是更改函数 startElement 和 endElement。它们的实现如下。
public static String getCorrectName(String qName, String name) {//used to fix bug from the sax on version 2.1
String _retValue = null;
if (Build.VERSION.SDK_INT<=7) _retValue = localName;
else _retValue = qName;
return _retValue;
}
//opening element tag
@Override
public void startElement (String uri, String name, String qName, Attributes atts)
{
String corretcName=getCorrectName(qName, name);
if(corretcName.equals("ARQUIVO"))
{
Log.d("DataHandler", "Start of ARQUIVO");
}
}
//closing element tag
@Override
public void endElement (String uri, String name, String qName)
{
String corretcName=getCorrectName(qName, name);
if(corretcName.equals("ARQUIVO"))
{
Log.d("DataHandler", "End of ARQUIVO");
}
}
关于Android:在不同 Android 版本上使用 SAX 解析器时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15067164/