【问题标题】:XmlPullParserException while parsing string.xml file解析 string.xml 文件时出现 XmlPullParserException
【发布时间】:2015-01-18 06:52:23
【问题描述】:

我正在尝试解析与 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) 

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

【问题讨论】:

  • 发布parseXml()的内容。
  • 您的 xml 无效。 test here
  • 仔细检查您是否正在解析预期的 XML。由于没有遇到特定元素的结束标记,因此解析失败。
  • 发生这种情况是因为 标签嵌套在 标签内。但我需要将数据呈现在整个 标记中。
  • parseXml() 的代码是什么?还是从哪里来的?

标签: java android xml android-xmlpullparser


【解决方案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(); 
}

【讨论】:

  • 这仍然不起作用。您可以使用我的输入 xml 文件进行检查。
  • 希望这可行。使用“字符串”元素进行测试,其中在之前、之后和之后的文本中包含多个 b。
  • 它可能适用于 但对于 标签它将再次失败。简而言之,string.xml 文件可以包含可以在 res 文件夹的 string.xml 文件中定义的格式。
  • @AnujKumarJha 对于 xliff 它不应该失败 - 你调用 xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); - 我修复了丢失的}。连接不良。
猜你喜欢
  • 1970-01-01
  • 2017-07-17
  • 2016-07-11
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
相关资源
最近更新 更多