1. 程式人生 > >PullXml解析Xml檔案(一般用於安卓)

PullXml解析Xml檔案(一般用於安卓)

在移動端,對Xml解析一般是使用PullXml解析,其實還有另外兩種解析方式,Dom解析和SAX解析,各有優缺點,今天就先介紹Pull解析方式。

要想使用Pull解析,需要先匯入jar包:

給出Xml檔案如下:

<note>
    <to>
小紅
    </to>
    <to>
Allen
    </to>
    <from>
John
    </from>
    <heading font="微軟雅黑" color="red">
Reminder
    </heading>
<body> <font>宋體五號</font> <color>綠色</color> <level>6</level> <mesage>Don't forget the meeting!</mesage> </body> <body> <font>Source Pro Code</font> <color>black</color>
<level>1</level> <message>里約</message> </body> </note>

由上檔案,我們可以創建出實體類,用來儲存從Xml檔案讀取到的資訊

/**
 * project pullxmltest
 * package PACKAGE_NAME
 * Created by xsm on 2016/8/9.
 */
public class Note {private List<String> receivers;//用來儲存讀取到的<to>標籤的內容
private String from; //因為heading標籤有屬性,所以可以建立一個Heading類來儲存其內容和屬性值  private Heading heading;
    //用來儲存讀取到的<body>標籤,因為<body>裡面有子標籤,所以需建立一個Body實體類
private LinkedList<Body> bodies;public String getFrom() { return from;} public void setFrom(String from) { this.from = from;} public Heading getHeading() { return heading;} public void setHeading(Heading heading) { this.heading = heading;}public LinkedList<Body> getBodies() { return bodies;} public void setBodies(LinkedList<Body> bodies) { this.bodies = bodies;} public List<String> getReceivers() { return receivers;} public void setReceivers(List<String> receivers) { this.receivers = receivers;} @Overridepublic String toString() { return "Note{" + "receivers=" + receivers + ", from='" + from + '\'' + ", heading=" + heading + ", body='" + bodies + '\'' + '}';}} Heading實體類和Body實體類如下:
/**
 * project pullxmltest
 * package PACKAGE_NAME
 * Created by xsm on 2016/8/9.
 */
public class Heading {
    private String font;
    private String color;
    private String text;
    public String getFont() {
        return font;
}

    public void setFont(String font) {
        this.font = font;
}

    public String getColor() {
        return color;
}

    public void setColor(String color) {
        this.color = color;
}

    public String getText() {
        return text;
}

    public void setText(String text) {
        this.text = text;
}

    @Override
public String toString() {
        return "Heading{" +
                "font='" + font + '\'' +
                ", color='" + color + '\'' +
                ", text='" + text + '\'' +
                '}';
}
}
/**
 * project pullxmltest
 * package PACKAGE_NAME
 * Created by xsm on 2016/8/9.
 */
public class Body {
    private String font;
    private String color;
    private int level;
    private String message;
    public String getFont() {
        return font;
}

    public void setFont(String font) {
        this.font = font;
}

    public String getColor() {
        return color;
}

    public void setColor(String color) {
        this.color = color;
}

    public int getLevel() {
        return level;
}

    public void setLevel(int level) {
        this.level = level;
}

    public String getMessage() {
        return message;
}

    public void setMessage(String message) {
        this.message = message;
}

    @Override
public String toString() {
        return "Body{" +
                "font='" + font + '\'' +
                ", color='" + color + '\'' +
                ", level=" + level +
                ", message='" + message + '\'' +
                '}';
}
}
解析方式如下:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
/**
 * project pullxmltest
 * package PACKAGE_NAME
 * Created by xsm on 2016/8/9.
 */
public class Test01 {
    public static void main(String[] args) {
        String src = "<note>\n" +
                "    <to>\n" +
                "        小紅\n" +
                "    </to>\n" +
                "    <to>\n" +
                "        Allen\n" +
                "    </to>\n" +
                "    <from>\n" +
                "        John\n" +
                "    </from>\n" +
                "    <heading font=\"微軟雅黑\" color=\"red\">\n" +
                "        Reminder\n" +
                "    </heading>\n" +
                "    <body>\n" +
                "        <font>宋體五號</font>\n" +
                "        <color>綠色</color>\n" +
                "        <level>6</level>\n" +
                "        <mesage>Don't forget the meeting!</mesage>\n" +
                "    </body>\n" +
                "    <body>\n" +
                "        <font>Source Pro Code</font>\n" +
                "        <color>black</color>\n" +
                "        <level>1</level>\n" +
                "        <message>里約</message>\n" +
                "    </body>\n" +
                "</note>";
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new FileInputStream("res/test.xml"),"UTF-8");//給出Xml檔案的地址,並指定編碼
Note note = new Note();
note.setReceivers(new ArrayList<String>());
note.setBodies(new LinkedList<Body>());
            int type;
            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
                switch (type) {
                    case XmlPullParser.START_DOCUMENT:
                        System.out.println("文件開始");
                        break;
                    case XmlPullParser.START_TAG:
                        switch (parser.getName()){
                            case "to":
                                note.getReceivers().add(parser.nextText().trim());
                                break;
                            case "from":
                                note.setFrom(parser.nextText());
                                break;
                            case "heading":
                                Heading heading = new Heading();
heading.setFont(parser.getAttributeValue(null,"font"));
heading.setColor(parser.getAttributeValue(null,"color"));
heading.setText(parser.nextText());
note.setHeading(heading);
                                break;
                            case "body":
                                note.getBodies().add(new Body());
                                break;
                            case "font":
                                note.getBodies().getLast().setFont(parser.nextText().trim());
                                break;
                            case "color":
                                note.getBodies().getLast().setColor(parser.nextText().trim());
                                break;
                            case "level":
                                note.getBodies().getLast().setLevel(Integer.parseInt(parser.nextText().trim()));
                                break;
                            case "message":
                                note.getBodies().getLast().setMessage(parser.nextText().trim());
                                break;
}
                        break;
                    case XmlPullParser.TEXT:
                        break;
                    case XmlPullParser.END_TAG:
                        System.out.println(parser.getName() + "標籤結束");
                        break;
}
            }
            System.out.println(note.getReceivers());
System.out.println(note.getBodies());
System.out.println(note.getHeading());
} catch (XmlPullParserException e) {
            e.printStackTrace();
} catch (FileNotFoundException e) {
            e.printStackTrace();
} catch (IOException e) {
            e.printStackTrace();
}
    }
}
得到結果如下圖:

解析過程中的方法如有不懂可以參考http://www.kxml.org/javadoc/index.html