public class Person { private int id; private int age; private String name; private String sex; private String address; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Person{" + "id=" + id + ", age=" + age + ", name='" + name + '\'' + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
public static void createXml(Context context,List<Person> list) { XmlSerializer serializer=Xml.newSerializer();//xml文件生成器 File file=new File(Environment.getExternalStorageDirectory(),"person.xml"); FileOutputStream fos=null; try { fos=new FileOutputStream(file); serializer.setOutput(fos,"utf-8");//爲xml生成器設置輸出流和字符編碼 serializer.startDocument("utf-8",true);//開始文檔,參數分別爲字符編碼和是否保持獨立 serializer.startTag(null,"persons");//開始標籤,參數分別爲:命名空間和標籤名 for(Person person:list){ serializer.startTag(null,"person"); serializer.attribute(null,"id",person.getId()+""); serializer.startTag(null,"name");//開始標籤 serializer.text(person.getName());//文本內容 serializer.endTag(null,"name");//結束標籤 serializer.startTag(null,"sex"); serializer.text(person.getSex()); serializer.endTag(null,"sex"); serializer.startTag(null,"age"); serializer.text(person.getAge()+""); serializer.endTag(null,"age"); serializer.startTag(null,"address"); serializer.text(person.getAddress()); serializer.endTag(null,"address"); serializer.endTag(null,"person"); } serializer.endTag(null,"persons");//結束標籤 serializer.endDocument();//結束xml文檔 Toast.makeText(context.getApplicationContext(),"生成成功!",Toast.LENGTH_SHORT).show(); } catch (IOException e) { Toast.makeText(context.getApplicationContext(),"生成失敗!",Toast.LENGTH_SHORT).show(); e.printStackTrace(); }finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
//pull方式解析XML文件 public static List<Person> parseXMLWithPull(File xmlData){ try { FileInputStream fis=new FileInputStream(xmlData); List<Person> list=null; Person person=null; //獲取xml pull解析器 XmlPullParserFactory factory=XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser=factory.newPullParser(); xmlPullParser.setInput(fis,"utf-8");//參數分別爲輸入流和字符編碼 int eventType=xmlPullParser.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){//若是事件不等於文檔結束事件就繼續循環 switch (eventType){ case XmlPullParser.START_TAG: if("persons".equals(xmlPullParser.getName())){ list=new ArrayList<>(); }else if("person".equals(xmlPullParser.getName())){ person=new Person(); person.setId(Integer.valueOf(xmlPullParser.getAttributeValue(0))); }else if("name".equals(xmlPullParser.getName())){ person.setName(xmlPullParser.nextText()); }else if("sex".equals(xmlPullParser.getName())){ person.setSex(xmlPullParser.nextText()); }else if("address".equals(xmlPullParser.getName())){ person.setAddress(xmlPullParser.nextText()); }else if("age".equals(xmlPullParser.getName())){ person.setAge(Integer.valueOf(xmlPullParser.nextText())); } break; case XmlPullParser.END_TAG: if("person".equals(xmlPullParser.getName())){ list.add(person); person=null; } break; } eventType=xmlPullParser.next(); } return list; } catch (FileNotFoundException e) { e.printStackTrace(); return null; } catch (XmlPullParserException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } }
//SAX方式解析XML文件 public static List<Person> parseXMLWithSAX(File xmlData){ try { SAXParserFactory factory=SAXParserFactory.newInstance();//建立SAX解析工廠 SAXParser saxParser=factory.newSAXParser();//建立SAX解析器 SAXHandler handler=new SAXHandler();//建立處理函數 saxParser.parse(xmlData,handler);//開始解析 List<Person> list= handler.getPersons();//獲取返回數據 return list; } catch (ParserConfigurationException e) { e.printStackTrace(); return null; } catch (SAXException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } } //SAX處理類 private static class SAXHandler extends DefaultHandler{ private List<Person> list=null; private Person person=null; private String nodeName="";//當前解析的標籤 //返回解析結果 public List<Person> getPersons(){ return list; } //文檔開始 @Override public void startDocument() throws SAXException { super.startDocument(); list=new ArrayList<>(); } //文檔結束 @Override public void endDocument() throws SAXException { super.endDocument(); } //節點開始標籤 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); nodeName=localName; if("person".equals(localName)){ person=new Person(); person.setId(Integer.valueOf(attributes.getValue("id"))); } } //節點結束標籤 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if("person".equals(localName)){ list.add(person); person=null; } nodeName=""; } //文本數據 若是標籤存在換行也會進入該方法,可是data數據爲null,記得作非空判斷" @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); String data=new String(ch,start,length); if(!TextUtils.isEmpty(data)&&!TextUtils.isEmpty(nodeName)){ return; } if("age".equals(nodeName)){ person.setAge(Integer.valueOf(data)); }else if("address".equals(nodeName)){ person.setAddress(data); }else if("name".equals(nodeName)){ person.setName(data); }else if("sex".equals(nodeName)){ person.setSex(data); } } }
3.3 Dom解析XML文件 node
//DOM解析XML文件 private List<Person> parseXMLWithDom(File xmlData){ List<Person> list=new ArrayList<>(); try { //得到工廠對象,以及經過DOM工廠對象獲取DOMBuilder對象 DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); //解析XML輸入流,獲得Document對象,表示一個XML文檔 InputStream fis=getAssets().open("person.xml"); Document document=builder.parse(xmlData); //獲取文檔中的根節點persons Element element=document.getDocumentElement(); //獲取Element下一級的person節點集合,以及NodeList的形式存放 NodeList peronsNodes=element.getElementsByTagName("person"); for(int i=0;i<peronsNodes.getLength();i++){ //循環獲取索引爲i的person節點 Element personElement= (Element) peronsNodes.item(i); Person person=new Person(); //經過屬性名,獲取節點的屬性id person.setId(Integer.parseInt(personElement.getAttribute("id"))); //獲取索引i的person節點下的子節點集合 NodeList childNodes=personElement.getChildNodes(); for (int j=0;j<childNodes.getLength();j++){ //循環遍歷每一個person下的子節點,若是判斷節點類型是ELEMENT_NODE,就能夠依據節點名稱給予解析 if(childNodes.item(j).getNodeType()== Node.ELEMENT_NODE){ if("name".equals(childNodes.item(j).getNodeName())){ //由於文本也是一個文本節點,因此這裏讀取到那麼節點的時候,經過getFirstChild()能夠直接得到 //name節點下的第一個節點,就是name節點後的文本節點,取其value值,就是文本的內容 person.setName(childNodes.item(j).getFirstChild().getNodeValue()); }else if("age".equals(childNodes.item(j).getNodeName())){ person.setAge(Integer.parseInt(childNodes.item(j).getFirstChild().getNodeValue())); }else if("address".equals(childNodes.item(j).getNodeName())){ person.setAddress(childNodes.item(j).getNodeValue()); }else if("sex".equals(childNodes.item(j).getNodeName())){ person.setSex(childNodes.item(j).getNodeValue()); } } } //把解析到的person對象添加到list中 list.add(person); } return list; } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } return null; }