2

SAXパーサーを使用してさまざまなAndroidリリースで非常に単純なXMLファイルを解析する際に問題が発生しました。

Android2.3.3でMotorolaXT316を使用すると、コードは正常に機能します。すべてのタグに入力されていることがわかります。ただし、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の終了」というメッセージは表示されていません。

なぜこれが起こっているのかわかりませんし、修正できません。どんな助けでもありがたいです。

前もって感謝します。

4

1 に答える 1

2

このリンクは、問題を解決するのに役立ちましたcode.google.com/p/android/issues/detail?id=11223

どうやら、Android2.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");
}       
}
于 2013-02-27T13:59:07.843 に答える