Android XML解析器– XMLPullParser

时间:2020-02-23 14:29:25  来源:igfitidea点击:

欢迎使用XMLPullParser的android xml解析器示例。
我们将有一个示例XML文件,该文件将在android应用程序中解析并显示在页面上。

Android XML解析器

XML代表可扩展标记语言。
XML文件通常在android中进行解析,以从中检索相关信息。
我们可以使用三种类型的android XML解析器。

  • SAX解析器
  • DOM解析器
  • XMLPullParser

DOM解析器:DOM解析器使用基于对象的方法,其中将整个xml加载到内存中并进行验证。
然后,它开始解析xml文档。
它从起始节点解析到结束节点。
特定节点无法解析。
总体来说,它比其他两个要慢。

SAX和XMLPullParser:它们使用基于对象的方法,并且在内存和性能方面相似。
在上下文中,SAX与DOM相似,它开始从上到下进行解析,并且无法仅解析特定的节点。
相反,XMLPullParser可以解析特定的节点。

XML文件包含4个主要组件。

  • Prolog:包含有关文件信息的第一行是prolog。
    通常这是这行:
  • 事件:XML文件中的事件包括简单的开始和结束标记等
  • 文字:两个标签之间的简单文字。
    例如:我的文字</RandomTag
  • 属性:属性是标签中存在的标签的其他属性。
    示例:一些文本或者嵌套标签

XMLPullParser

XMLPullParser是推荐的android xml解析器。

在本教程中,我们将寻求在我们的android应用程序中实现XMLPullParser。

Android XML解析器代码

我们已经在主目录中创建了一个Assets目录,并其中添加了一个xml文件,如下所示。

<?xml version="1.0" encoding="utf-8"?>
<countries>
  <country id="1">
      <name>
          San Franceco
      </name>
      <capital>
          New Delhi
      </capital>
  </country>

  <country id="2">
      <name>
          Australia
      </name>
      <capital>
          Canberra
      </capital>
  </country>

  <country id="3">
      <name>
          USA
      </name>
      <capital>
          Washington, D.C.
      </capital>
  </country>

</countries>

注意:" id"是属性。

MainActivity.java如下:

package com.theitroad.xmlparsing;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

  TextView textView;

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

      textView= (TextView)findViewById(R.id.text);

      XmlPullParserFactory pullParserFactory;

      try {
          pullParserFactory = XmlPullParserFactory.newInstance();
          XmlPullParser parser = pullParserFactory.newPullParser();

          InputStream in_s = getApplicationContext().getAssets().open("sample.xml");
          parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
          parser.setInput(in_s, null);

          ArrayList<Country> countries=  parseXML(parser);

          String text="";

          for(Country country:countries)
          {

              text+= "id : "+country.getId()+" name : "+country.getName()+" capital : "+country.getCapital()+"\n";
          }

          textView.setText(text);

      } catch (XmlPullParserException e) {

          e.printStackTrace();
      } catch (IOException e) {
          //TODO Auto-generated catch block
          e.printStackTrace();
      }

  }

  private ArrayList<Country> parseXML(XmlPullParser parser) throws XmlPullParserException,IOException
  {
      ArrayList<Country> countries = null;
      int eventType = parser.getEventType();
      Country country = null;

      while (eventType != XmlPullParser.END_DOCUMENT){
          String name;
          switch (eventType){
              case XmlPullParser.START_DOCUMENT:
                  countries = new ArrayList();
                  break;
              case XmlPullParser.START_TAG:
                  name = parser.getName();
                  if (name.equals("country")){
                      country = new Country();
                      country.id=parser.getAttributeValue(null,"id");
                  } else if (country != null){
                      if (name.equals("name")){
                          country.name = parser.nextText();
                      } else if (name.equals("capital")){
                          country.capital = parser.nextText();
                      }
                  }
                  break;
              case XmlPullParser.END_TAG:
                  name = parser.getName();
                  if (name.equalsIgnoreCase("country") && country != null){
                      countries.add(country);
                  }
                  }
          eventType = parser.next();
      }

      return countries;

      }
}

XMLPullParser实例化

XMLPullParser可以通过两种方式实例化。

  • {列表}
XmlPullParserFactory pullParserFactory;
		try {
			pullParserFactory = XmlPullParserFactory.newInstance();
			XmlPullParser parser = pullParserFactory.newPullParser();
		} catch (XmlPullParserException e) {

			e.printStackTrace();
		}

使用switch语句和while循环,我们解析每个标签并查找相关数据,并在标签结束时将整个对象添加到ArrayList中。
我们刚刚遍历了完整的ArrayList,并附加了字符串以显示在当前的默认TextView中。