1、Pull概述
Android系統中和建立XML相關的包為org.xmlpull.v1,在這個包中不僅提供了用於建立XML的 XmlSerializer,還提供了用來解析XML的Pull方式解析器 XmlPullParser
XmlSerializer沒有像XmlPullParser那樣提取XML事件,而是把它們推出到資料流OutputStream或Writer中。
XmlSerializer提供了很直觀的API,即使用startDocument開始文檔,endDocument結束文檔,startTag開始元素,endTag結束元素,text添加文本等。
Pull方式建立XML,應用了標準xml構造器 org.xmlpull.v1.XmlSerializer來建立 XML ,org.xmlpull.v1.XmlPullParser來解析XML,需要匯入以下內容
org.xmlpull.v1
org.xmlpull.v1.XmlPullParser;
org.xmlpull.v1.XmlPullParserException;
org.xmlpull.v1.XmlPullParserFactory;
org.xmlpull.v1.XmlSerializer;
sdk源碼查看路徑(google code)
Pull 建立和解析 XML 的:
2、Pull 建立 XML
pull方式,建立xml是通過 XmlSerializer 類實現
首先,通過XmlSerializer得到建立xml的執行個體 xmlSerializer
接著,通過 xmlSerializer 設定輸出 xmlSerializer.setOutput,xmlSerializer.startDocument("utf-8", null)設定xml屬性等
然後,通過 xmlSerializer 建立 startDocument、startTag、text、endTag、endDocument等
Code
/** Pull方式,建立 XML */<br />public String pullXMLCreate(){<br />StringWriter xmlWriter = new StringWriter();</p><p>Person []persons = new Person[3];// 建立節點Person對象<br />persons[0] = new Person(1, "sunboy_2050", "http://blog.csdn.net/sunboy_2050");<br />persons[1] = new Person(2, "baidu", "http://www.baidu.com");<br />persons[2] = new Person(3, "google", "http://www.google.com");</p><p>try {<br />//// 方式一:使用Android提供的工具 + 生產力類android.util.Xml<br />//XmlSerializer xmlSerializer = Xml.newSerializer();</p><p>// 方式二:使用工廠類XmlPullParserFactory的方式<br />XmlPullParserFactory factory = XmlPullParserFactory.newInstance();<br />XmlSerializer xmlSerializer = factory.newSerializer();</p><p>xmlSerializer.setOutput(xmlWriter);// 儲存建立的xml</p><p>xmlSerializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);<br />//xmlSerializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " ");// 設定屬性<br />//xmlSerializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n");<br />xmlSerializer.startDocument("utf-8", null);// <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> </p><p>xmlSerializer.startTag("", "root");<br />xmlSerializer.attribute("", "author", "homer");<br />xmlSerializer.attribute("", "date", "2012-04-28");</p><p>int personsLen = persons.length;<br />for(int i=0; i<personsLen; i++) {<br />xmlSerializer.startTag("", "person");// 建立person節點</p><p>xmlSerializer.startTag("", "id");<br />xmlSerializer.text(persons[i].getId()+"");<br />xmlSerializer.endTag("", "id");</p><p>xmlSerializer.startTag("", "name");<br />xmlSerializer.text(persons[i].getName());<br />xmlSerializer.endTag("", "name");</p><p>xmlSerializer.startTag("", "blog");<br />xmlSerializer.text(persons[i].getBlog());<br />xmlSerializer.endTag("", "blog");</p><p>xmlSerializer.endTag("", "person");<br />}</p><p>xmlSerializer.endTag("", "root");<br />xmlSerializer.endDocument();</p><p>} catch (XmlPullParserException e) {// XmlPullParserFactory.newInstance<br />e.printStackTrace();<br />} catch (IllegalArgumentException e) {// xmlSerializer.setOutput<br />e.printStackTrace();<br />} catch (IllegalStateException e) {// xmlSerializer.setOutput<br />e.printStackTrace();<br />} catch (IOException e) {// xmlSerializer.setOutput<br />e.printStackTrace();<br />} catch (Exception e) {<br />e.printStackTrace();<br />}</p><p>savedXML(fileName, xmlWriter.toString());<br />return xmlWriter.toString();<br />}
運行結果:
3、Pull 解析 XML
pull方式,解析xml是通過 XmlPullParser 類實現
首先,通過XmlPullParser得到解析xml的執行個體 xpp
接著,通過 xpp設定輸入 xpp.setInput(is, "utf-8"),聲明定義儲存xml資訊的資料結構(如:Person數組)
然後,通過 xpp 解析 START_DOCUMENT、START_TAG、TEXT、END_TAG、END_DOCUMENT等
Code
/** Pull方式,解析 XML */<br />public String pullXMLResolve(){<br />StringWriter xmlWriter = new StringWriter();</p><p>InputStream is = readXML(fileName);<br />try {<br />//// 方式一:使用Android提供的工具 + 生產力類android.util.Xml<br />//XmlPullParser xpp = Xml.newPullParser();</p><p>// 方式二:使用工廠類XmlPullParserFactory的方式<br />XmlPullParserFactory factory = XmlPullParserFactory.newInstance();<br />XmlPullParser xpp = factory.newPullParser();</p><p>xpp.setInput(is, "utf-8");</p><p>List<Person> personsList = null;// 儲存xml的person節點<br />Person person = null;<br />StringBuffer xmlHeader = null;// 儲存xml頭部<br />String ele = null;// Element flag</p><p>int eventType = xpp.getEventType();<br />while(XmlPullParser.END_DOCUMENT != eventType) {<br />switch (eventType) {<br />case XmlPullParser.START_DOCUMENT:<br />personsList = new ArrayList<Person>();// 初始化persons<br />xmlHeader = new StringBuffer();// 初始化xmlHeader<br />break;</p><p>case XmlPullParser.START_TAG:<br />if("root".equals(xpp.getName())) {<br />String attrAuthor = xpp.getAttributeValue(0);<br />String attrDate = xpp.getAttributeValue(1);<br />xmlHeader.append("root").append("\t\t");<br />xmlHeader.append(attrAuthor).append("\t");<br />xmlHeader.append(attrDate).append("\n");<br />} else if("person".equals(xpp.getName())) {<br />person = new Person();// 建立person執行個體<br />} else if("id".equals(xpp.getName())) {<br />ele = "id";<br />} else if("name".equals(xpp.getName())) {<br />ele = "name";<br />} else if("blog".equals(xpp.getName())) {<br />ele = "blog";<br />} else {<br />ele = null;<br />}<br />break;</p><p>case XmlPullParser.TEXT:<br />if(null != ele) {<br />if("id".equals(ele)) {<br />person.setId(Integer.parseInt(xpp.getText()));<br />} else if("name".equals(ele)) {<br />person.setName(xpp.getText());<br />} else if("blog".equals(ele)) {<br />person.setBlog(xpp.getText());<br />}<br />}<br />break;</p><p>case XmlPullParser.END_TAG:<br />if("person".equals(xpp.getName())){<br />personsList.add(person);<br />person = null;<br />}<br />ele = null;<br />break;<br />}</p><p>eventType = xpp.next();// 下一個事件類型<br />}</p><p>xmlWriter.append(xmlHeader);<br />int personsLen = personsList.size();<br />for(int i=0; i<personsLen; i++) {<br />xmlWriter.append(personsList.get(i).toString());<br />}</p><p>} catch (XmlPullParserException e) {// XmlPullParserFactory.newInstance<br />e.printStackTrace();<br />} catch (Exception e) {<br />e.printStackTrace();<br />}</p><p>return xmlWriter.toString();<br />}
運行結果:
4、Person類
請參見前面部落格 Android 建立與解析XML(二)—— Dom方式 【4、Person類】
代碼下載
參考推薦:
org.xmlpull.v1
pull建立xml