使用XMLPullParser进行Android XML解析

In this tutorial you will learn about android xml parsing using XMLPullParser.

在本教程中,您将学习使用XMLPullParser解析android xml的知识。

XML is a popular and very commonly used format for sharing data on internet. In android there are several ways to parse xml data like DOM, SAX and XMLPullParser. But in this article I will teach you how to parse xml using XMLPullParser.

XML是一种流行且非常常用的格式,用于在Internet上共享数据。 在android中,有几种解析xml数据的方法,例如DOM,SAX和XMLPullParser。 但是在本文中,我将教您如何使用XMLPullParser解析xml。

使用XMLPullParser进行Android XML解析 (Android XML Parsing Using XMLPullParser)

XML解析的步骤 (Steps for XML Parsing)

XML parsing includes following steps.

XML解析包括以下步骤。

1. First we have to read the xml file or data inside InputStream.

1.首先,我们必须读取InputStream中的xml文件或数据。

1
InputStream stream = this.getResources().openRawResource(R.raw.student);
1
InputStream stream = this . getResources ( ) . openRawResource ( R . raw . student ) ;

Here I have assumed that student.xml file is present in res/raw folder of project. You can also fetch the xml data from internet using url. The xml file contains data of students as shown below.

在这里,我假设project.res / raw文件夹中存在student.xml文件。 您也可以使用url从Internet上获取xml数据。 xml文件包含学生数据,如下所示。

2. Create an instance of XMLPullParserFactory and using it call newPullParser() method to get instance of XMLPullParser.

2.创建一个XMLPullParserFactory实例,并使用它调用newPullParser()方法来获取XMLPullParser实例。

1
2
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = xmlPullParserFactory.newPullParser();
1
2
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory . newInstance ( ) ;
XmlPullParser parser = xmlPullParserFactory . newPullParser ( ) ;

3. Now provide InputStream object to XMLPullParser as an input using setInput() method.

3.现在,使用setInput()方法将InputStream对象提供给XMLPullParser作为输入。

1
2
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(stream, null);
1
2
parser . setFeature ( XmlPullParser . FEATURE_PROCESS_NAMESPACES , false ) ;
parser . setInput ( stream , null ) ;

4. Finally the data is read form XMLPullParser in following way.

4.最后,以下列方式从XMLPullParser读取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
String tag_name = "", text = "";
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
tag_name = parser.getName();
switch (event) {
case XmlPullParser.START_TAG:
                        break;
case XmlPullParser.TEXT:
                        text = parser.getText();
                        break;
case XmlPullParser.END_TAG:
switch(tag_name) {
                            case "name": textView.append("Name: " + text + "\n");
                                        break;
                            case "rollno": textView.append("Roll No: " + text + "\n");
                                        break;
                            case "age": textView.append("Age: " + text + "\n\n");
                                        break;
                        }
                        break;
}
event = parser.next();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
String tag_name = "" , text = "" ;
int event = parser . getEventType ( ) ;
while ( event != XmlPullParser . END_DOCUMENT ) {
tag_name = parser . getName ( ) ;
switch ( event ) {
case XmlPullParser . START_TAG :
                         break ;
case XmlPullParser . TEXT :
                         text = parser . getText ( ) ;
                         break ;
case XmlPullParser . END_TAG :
switch ( tag_name ) {
                             case "name" : textView . append ( "Name: " + text + "\n" ) ;
                                         break ;
                             case "rollno" : textView . append ( "Roll No: " + text + "\n" ) ;
                                         break ;
                             case "age" : textView . append ( "Age: " + text + "\n\n" ) ;
                                         break ;
                         }
                         break ;
}
event = parser . next ( ) ;
}

The above code should be placed inside try-catch block.

上面的代码应该放在try-catch块中。

The getEventType() method gives the type of event. It can be END_DOCUMENT, START_TAG, END_TAG, etc. On the basis of these events we filter and read the xml data.

getEventType()方法提供事件的类型。 可以是END_DOCUMENT, START_TAGEND_TAG等。根据这些事件,我们过滤并读取xml数据。

The getName() method gives tag name while getText() method gives text information present inside that tag.

getName()方法给出标签名称,而getText()方法给出标签内的文本信息。

Android XMLPullParser示例 (Android XMLPullParser Example)

Below is a simple example that parses student data present in xml format using XMLPullParser.

下面是一个简单的示例,该示例使用XMLPullParser解析xml格式的学生数据。

1. Create a new android project with package name com.androidxmlparser.

1.创建一个新的android项目,包名称为com.androidxmlparser。

2. Create a folder raw under res. Add a file student.xml inside res/raw with following xml data.

2.在res下创建一个原始文件夹res / raw内添加带有以下xml数据的文件student.xml

student.xml

student.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0"?>
<class>
<student>
<name>Neeraj Mishra</name>
<rollno>10</rollno>
<age>22</age>
</student>
<student>
<name>Mayank Khandiwal</name>
<rollno>11</rollno>
<age>22</age>
</student>
<student>
<name>Sumit Gendar</name>
<rollno>12</rollno>
<age>22</age>
</student>
<student>
<name>Vivek Pathak</name>
<rollno>13</rollno>
<age>22</age>
</student>
</class>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<? xml version = "1.0" ?>
< class >
< student >
< name > Neeraj Mishra < / name >
< rollno > 10 < / rollno >
< age > 22 < / age >
< / student >
< student >
< name > Mayank Khandiwal < / name >
< rollno > 11 < / rollno >
< age > 22 < / age >
< / student >
< student >
< name > Sumit Gendar < / name >
< rollno > 12 < / rollno >
< age > 22 < / age >
< / student >
< student >
< name > Vivek Pathak < / name >
< rollno > 13 < / rollno >
< age > 22 < / age >
< / student >
< / class >

3. By default you would get an activity MainActivity when you have created the project. This activity is used to display the parsed xml data. Just add following code inside its xml layout and java source file.

3.默认情况下,创建项目后,您将获得一个活动MainActivity 。 此活动用于显示已解析的xml数据。 只需在其xml布局和Java源文件中添加以下代码即可。

activity_main.xml

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.androidxmlparser.MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:text=""/>
</RelativeLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout xmlns : android = "http://schemas.android.com/apk/res/android"
     xmlns : tools = "http://schemas.android.com/tools"
     android : layout_width = "match_parent"
     android : layout_height = "match_parent"
     android : paddingBottom = "@dimen/activity_vertical_margin"
     android : paddingLeft = "@dimen/activity_horizontal_margin"
     android : paddingRight = "@dimen/activity_horizontal_margin"
     android : paddingTop = "@dimen/activity_vertical_margin"
     tools : context = "com.androidxmlparser.MainActivity" >
     < TextView
         android : layout_width = "wrap_content"
         android : layout_height = "wrap_content"
         android : id = "@+id/textView"
         android : text = "" / >
< / RelativeLayout >

MainActivity.java

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.androidxmlparser;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.InputStream;
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.textView);
        InputStream stream = this.getResources().openRawResource(R.raw.student);
        try {
            XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = xmlPullParserFactory.newPullParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            parser.setInput(stream, null);
            String tag_name = "", text = "";
            int event = parser.getEventType();
            while (event != XmlPullParser.END_DOCUMENT) {
                tag_name = parser.getName();
                switch (event) {
                    case XmlPullParser.START_TAG:
                        break;
                    case XmlPullParser.TEXT:
                        text = parser.getText();
                        break;
                    case XmlPullParser.END_TAG:
                        switch(tag_name) {
                            case "name": textView.append("Name: " + text + "\n");
                                        break;
                            case "rollno": textView.append("Roll No: " + text + "\n");
                                        break;
                            case "age": textView.append("Age: " + text + "\n\n");
                                        break;
                        }
                        break;
                }
                event = parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com . androidxmlparser ;
import android . support . v7 . app . AppCompatActivity ;
import android . os . Bundle ;
import android . widget . TextView ;
import org . xmlpull . v1 . XmlPullParser ;
import org . xmlpull . v1 . XmlPullParserFactory ;
import java . io . InputStream ;
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 . textView ) ;
         InputStream stream = this . getResources ( ) . openRawResource ( R . raw . student ) ;
         try {
             XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory . newInstance ( ) ;
             XmlPullParser parser = xmlPullParserFactory . newPullParser ( ) ;
             parser . setFeature ( XmlPullParser . FEATURE_PROCESS_NAMESPACES , false ) ;
             parser . setInput ( stream , null ) ;
             String tag_name = "" , text = "" ;
             int event = parser . getEventType ( ) ;
             while ( event != XmlPullParser . END_DOCUMENT ) {
                 tag_name = parser . getName ( ) ;
                 switch ( event ) {
                     case XmlPullParser . START_TAG :
                         break ;
                     case XmlPullParser . TEXT :
                         text = parser . getText ( ) ;
                         break ;
                     case XmlPullParser . END_TAG :
                         switch ( tag_name ) {
                             case "name" : textView . append ( "Name: " + text + "\n" ) ;
                                         break ;
                             case "rollno" : textView . append ( "Roll No: " + text + "\n" ) ;
                                         break ;
                             case "age" : textView . append ( "Age: " + text + "\n\n" ) ;
                                         break ;
                         }
                         break ;
                 }
                 event = parser . next ( ) ;
             }
         } catch ( Exception e ) {
             e . printStackTrace ( ) ;
         }
     }
}

4. Now save and run the project. If everything was done correctly then you will see an output as shown in below image.

4.现在保存并运行项目。 如果一切都正确完成,那么您将看到如下图所示的输出。

Screenshot

屏幕截图

使用XMLPullParser进行Android XML解析

Comment below if you have doubts or found anything incorrect in above android xml parsing tutorial.

如果您有疑问或在上面的android xml解析教程中发现任何不正确的内容,请在下面评论。

翻译自: https://www.thecrazyprogrammer.com/2017/01/android-xml-parsing-using-xmlpullparser.html