PullXml解析Xml檔案(一般用於安卓)
阿新 • • 發佈:2019-01-06
在移動端,對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