解析string.xml文件时出现XmlPullParserException

时间:2015-01-18 06:52:23

标签: java android xml android-xmlpullparser

我正在尝试解析与res文件夹下的string.xml文件类似的xml文件。但是在解析时我会遇到异常。  下面是我的xml文件。

<resources>

    <!-- Enrollment Messages -->
    <string name="configure_email_text">No corporate email accounts have been configured on this device. To    configure them, click <b>Configure Email</b></string>
    <string name="invalid_credentials">Authentication failed. Enter valid credentials.</string>
    <string name="invalid_passcode">Authentication failed. Enter valid Passcode.</string>
     <string-array name="lang_support">
        <item>en_US</item>
        <item>en_GB</item>
    </string-array>
      <string name="picker_combined_view_fmt">Combined view (<xliff:g id="count">%s</xliff:g>)</string>
</resources>    

以下是我用来解析XML的代码。

 private void loadXML()
    {
        // TODO Auto-generated method stub
        InputStream ins = null;
        try{
            //Debug.startMethodTracing("parsingdetail");

            ins=getAssets().open("strings.xml");
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            // factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            xpp.setInput(ins, null);
            parseXml(xpp);
            int j=hMap.size();
            if(j>0){
               System.out.println("Anuj Kumar Jha "+j);
            }
        }catch(XmlPullParserException e){
            System.out.println("anuj kumar jha"+e);
            e.printStackTrace();
        }catch(IOException e){
            System.out.println("anuj kumar jha"+e);
            e.printStackTrace();
        }
        finally{
            if(ins!=null){
                try {
                    ins.close();
                }
                catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }


    private void parseXml(XmlPullParser parser) throws XmlPullParserException,IOException
    {
        // TODO Auto-generated method stub
        int eventType=parser.getEventType();
        while(eventType!=XmlPullParser.END_TAG){
            String key=null;
            String value=null;
            switch(eventType){
            case XmlPullParser.START_TAG:
                String name=parser.getName();
                if(name.equalsIgnoreCase("string")){
                    key=parser.getAttributeValue(null,"name");
                    value=parser.nextText();
                    hMap.put(key, value);
                    if(parser.getEventType()!=XmlPullParser.END_TAG){
                        parser.nextTag();
                    }
                }
            }
            eventType=parser.next();
         }  
     }   

以下是我得到的例外

01-18 12:19:10.506: I/System.out(16115): anuj kumar jhaorg.xmlpull.v1.XmlPullParserException: END_TAG expected (position:START_TAG <b>@5:137 in java.io.InputStreamReader@42b54168) 

我认为这是因为第一个字符串标记中的标记。如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

遵循此模式(我在http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html上找到):

     int eventType = xpp.getEventType();
     while (eventType != XmlPullParser.END_DOCUMENT) {
      if(eventType == XmlPullParser.START_TAG) {
          String name=parser.getName();
            if(name.equalsIgnoreCase("string")){
                key=parser.getAttributeValue(null,"name");
                String value = collectText(parser);
                hMap.put(key, value);
            }
      }
      eventType = xpp.next();
     }

private String collectText(XmlPullParser parser){
    StringBuilder sb = new StringBuilder();
    int eventType=parser.getEventType();
    while (eventType != XmlPullParser.END_TAG) {
      if(eventType == XmlPullParser.START_TAG){
        sb.append( collectText(parser) );
      } else if(eventType == XmlPullParser.TEXT) {
        sb.append( xpp.getText() );
      }       
      eventType = xpp.next();
     }
  return sb.toString(); 
}