解析从Android上的res文件的XML文件

问题描述:

我想解析一个XML文件,我已经定义了一个名为raw的文件夹,它本身包含在我的android应用程序的res文件夹中。我基本上使用Android开发者指南中关于如何处理XML文件的版本。解析从Android上的res文件的XML文件

http://developer.android.com/training/basics/network-ops/xml.html

目前该应用程序将运行并找到该文件,然后运行解析方法,但都应该找到你想从数据中提取标签的方法似乎跳过,结果我在这种情况下,Unit类型的数组列表中有一个没有名字的Unit。

下面是解析XML文件的类的一个副本,后面跟着我用来测试的XML文件。

public class UnitTableXMLParser extends AsyncTask<InputStream, Void, Void> { 
    private final String ns = null; 

    public ArrayList<Unit> parse(InputStream in) throws XmlPullParserException, IOException { 
     try { 
      XmlPullParser parser = Xml.newPullParser(); 
      parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
      parser.setInput(in, null); 
      parser.nextTag(); 
      return readFeed(parser); 
     } finally { 
      in.close(); 
     } 
    } 

    private ArrayList<Unit> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException { 
     parser.require(XmlPullParser.START_TAG, ns, "resources"); 
     while (parser.next() != XmlPullParser.END_TAG) { 
      if (parser.getEventType() != XmlPullParser.START_TAG) { 
       continue; 
      } 
      String name = parser.getName(); 

      if (name.equals("unit")) { 
       units.add(readUnit(parser)); 
      } else { 
       skip(parser); 
      } 
     } 
     return units; 
    } 

    private Unit readUnit(XmlPullParser parser) throws XmlPullParserException, IOException { 
     parser.require(XmlPullParser.START_TAG, ns, "unit"); 
     String name = null; 
     while (parser.next() != XmlPullParser.END_TAG) { 
      if (parser.getEventType() != XmlPullParser.START_TAG) { 
       continue; 
      } 

      String parserName = parser.getName(); 

      if (parserName.equals("name")) { 
       name = readName(parser); 
      } 
     } 
     return new Unit(name); 
    } 

    private String readName(XmlPullParser parser) throws IOException, XmlPullParserException { 
     parser.require(XmlPullParser.START_TAG, ns, "name"); 
     String name = readText(parser); 
     parser.require(XmlPullParser.END_TAG, ns, "name"); 
     return name; 
    } 

    private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { 
     String result = ""; 
     if (parser.next() == XmlPullParser.TEXT) { 
      result = parser.getText(); 
      parser.nextTag(); 
     } 
     return result; 
    } 

    private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      throw new IllegalStateException(); 
     } 
     int depth = 1; 
     while (depth != 0) { 
      switch (parser.next()) { 
      case XmlPullParser.END_TAG: 
       depth--; 
       break; 
      case XmlPullParser.START_TAG: 
       depth++; 
       break; 
      } 
     } 
    } 

    @Override 
    protected Void doInBackground(InputStream... params) { 
     Log.d(TAG, "UnitTableXMLParser exectued"); 
     try { 
      parse(params[0]); 
     } catch (IOException e) { 
      Log.d("Background Thread IOException", e.getMessage()); 
     } catch (XmlPullParserException e) { 
      Log.d("Background Thread XmlPullParserException", e.getMessage()); 
     } catch (Exception e) { 
      Log.d("Exception", e.getMessage()); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     xmlParsed = true; 
     super.onPostExecute(result); 
    } 
} 

和XML文件:

XML File

和输出: Output

,我可能会错误任何想法,将不胜感激,我已经试过name.matches并包含字符串匹配,但也没有工作。

干杯,

杰米

只需通过nextTag()规范的样子。如果它是START_TAG或END_TAG,则调用next()和返回事件,否则将引发新的XMLPullParserException。如果它符合文本或文档块,它不会如何工作。 很明显是这样。所以,你所有的try块被打破,结果为空。一个可怕的例子和糟糕的文档给了developer.android.com! 而我无法给你工作的答案 - 我是Android新手...