解析XML不会返回任何内容

时间:2014-10-17 20:46:44

标签: java android xml xmlpullparser

我目前正在尝试使用XmlResourceParser解析一些XML,然后使用ArrayAdapter在ListView上显示信息。问题是,我没有得到蚂蚁的结果。

我的xml结构是这样的:

<resources>

<categories>
    <animal>
        <word>
            <english>Animal</english>
            <french>Animal</french>
            <spanish>Animal</spanish>
            <portuguese>Animal</portuguese>
        </word>
    </animal>
    <transportation></transportation>
    <location></location>
    <clothing></clothing>
    <color></color>
    <people></people>
    <job></job>
    <society></society>
    <art></art>
    <beverages></beverages>
    <food></food>
    <home></home>
    <electronics></electronics>
    <body></body>
    <nature></nature>
    <material></material>
    <math></math>
    <directions></directions>
    <seasons></seasons>
    <numbers></numbers>
    <months></months>
    <days></days>
    <time></time>
    <verbs></verbs>
    <adjectives></adjectives>
</categories>

现在,每个类别都会有不同的单词,但此时我只想获取所有类别并在ListView中显示它们。要尝试使用以下代码获取所有类别:

public class MainActivity extends ActionBarActivity {

private ListView list;
private ArrayList<String> arrayCategories;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    list = (ListView) findViewById(R.id.listView1);

    try {
        arrayCategories = parseCategories();

        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
                 this, 
                 R.id.listView1,
                 arrayCategories );

         list.setAdapter(arrayAdapter); 

    } catch (IOException e) {
        e.printStackTrace();
    }

}

parseCategories函数如下:

    private ArrayList<String> parseCategories() throws IOException {
    ArrayList<String> categories = new ArrayList<String>();
    XmlResourceParser parser = getResources().getXml(R.xml.database);

    try {
        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG) {
                if (parser.getName().equals("categories")) {
                    categories.add(parser.nextText());
                }
            }

            eventType = parser.next();
        }
    } catch (XmlPullParserException e) {
        Log.e("XmlPullParserException", e.toString());
    }
    parser.close();

    return categories;
}

在解析xml时,我仍然有点缺乏经验,你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

问题是没有&#34;文字&#34;在categories元素中;但是,有很多子元素。

真正的任务可以简单地概括为:

  

如何获取所有元素的名称,这些元素是categories元素的直接子元素?

这个问题因XmlPullParser而变得有点复杂(使用DOM和/或XPath会更容易),但这是可行的。这里的诀窍是&#34;跳过&#34;通过保持一点深度计数器的子树;递归函数也可以。

int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {

  if (eventType == XmlPullParser.START_TAG
      && parser.getName().equals("categories")) { // catergories start

    int depth = 0;
    eventType = parser.next();
    while (!(depth == 0 && eventType == XmlPullParser.END_TAG)) { // end categories

      if (eventType == XmlPullParser.START_TAG) {
        if (depth == 0) {  // direct child of categories
          categories.add(parser.getName());
        }
        depth++;
      } else if (eventType == XmlPullParser.END_TAG) { // depth > 0
        depth--;
      }

      eventType = parser.next();
    }

  }

  eventType = parser.next();
}