android解析,组包XML文件

来源:互联网 发布:数据分析处理是什么 编辑:程序博客网 时间:2024/06/05 22:33
第一个例子:
1.
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><PersonInfoCache><person><pension>785.6</pension><basemonth>201201</basemonth><fund>198.4</fund><medical>196.4</medical></person><person><pension>785.6</pension><basemonth>201202</basemonth><fund>198.4</fund><medical>196.4</medical></person><person><pension>785.6</pension><basemonth>201203</basemonth><fund>198.4</fund><medical>196.4</medical></person><person><pension>785.6</pension><basemonth>201204</basemonth><fund>198.4</fund><medical>196.4</medical></person></PersonInfoCache>解析代码如下:public static List<Map<String, Object>> getPersons(InputStream xml) throws Exception{List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();Map<String,Object> map=new HashMap<String,Object>();XmlPullParser pullParser=Xml.newPullParser();pullParser.setInput(xml, "UTF-8");int event=pullParser.getEventType();while(event!=XmlPullParser.END_DOCUMENT){switch (event) {case XmlPullParser.START_DOCUMENT:break;case XmlPullParser.START_TAG:if("pension".equalsIgnoreCase(pullParser.getName())){map.put("pension", pullParser.nextText());}else if("basemonth".equalsIgnoreCase(pullParser.getName())){map.put("basemonth", pullParser.nextText());//SharedPreferences preferences=getSharedPreferences("itcase",);//Editor editor=preferences.edit();//System.out.println( pullParser.nextText());}else if("fund".equalsIgnoreCase(pullParser.getName())){map.put("fund", pullParser.nextText());}else if("medical".equalsIgnoreCase(pullParser.getName())){map.put("medical", pullParser.nextText());}break;
case XmlPullParser.END_TAG:if("person".equals(pullParser.getName())){list.add(map);                                        map=new HashMap<String,Object>(); //很重要}break;}
event=pullParser.next();}return list;}
2.

2.1使用XmlPullParser解析xml数据: 

      ①pullParser.setInput(xml, "UTF-8");给pull解析器一个输入流数据。

      ②int eventType = pullParser.getEventType();获取当前事件类型。

      ③while (eventType != XmlPullParser.END_DOCUMENT) 比对当前事件类型是否为xml文档中的"END_DOCUMENT",若“是”则结束解析。

         eventType = pullParser.next();顺移当前解析器的指针。

      ④case XmlPullParser.START_TAG:当解析遇到元素的开始标识时,判断具体是哪个元素,获取所需的数据。

      ⑤case XmlPullParser.END_TAG:当解析遇到元素的结束标识时,判断是否为一个完整数据的结束标识,若“是”则打包一条数据。

[java] view plaincopy
  1. public static List<Person> getPersons(InputStream xml) throws Exception {  
  2.     List<Person> persons = null;  
  3.     Person person = null;  
  4.     XmlPullParser pullParser = Xml.newPullParser();  
  5.     pullParser.setInput(xml, "UTF-8");  
  6.     int eventType = pullParser.getEventType();  
  7.     while (eventType != XmlPullParser.END_DOCUMENT) {  
  8.         switch (eventType) {  
  9.         case XmlPullParser.START_DOCUMENT:  
  10.             persons = new ArrayList<Person>();  
  11.             break;  
  12.         case XmlPullParser.START_TAG:  
  13.             if ("person".equals(pullParser.getName())) {  
  14.                 int id = Integer.parseInt(pullParser.getAttributeValue(0));  
  15.                 person = new Person();  
  16.                 person.setId(id);  
  17.             }  
  18.             if ("name".equals(pullParser.getName())) {  
  19.                 String name = pullParser.nextText();  
  20.                 person.setName(name);  
  21.             }  
  22.             if ("age".equals(pullParser.getName())) {  
  23.                 int age = Integer.parseInt(pullParser.nextText());  
  24.                 person.setAge(age);  
  25.             }  
  26.             break;  
  27.   
  28.         case XmlPullParser.END_TAG:  
  29.             if ("person".equals(pullParser.getName())) {  
  30.                 persons.add(person);  
  31.                 person = null;  
  32.             }  
  33.             break;  
  34.   
  35.         }  
  36.         eventType = pullParser.next();  
  37.     }  
  38.     return persons;  
  39. }  
2.2、XmlSerializer序列化生成xml数据:

      ①serializer.setOutput(outStream, "UTF-8");给序列化器一个输出流。

      ②根据所需xml数据格式开始序列化生成xml数据。

[java] view plaincopy
  1. public static void createXml(List<Person> persons, OutputStream outStream) throws Exception {  
  2.     XmlSerializer serializer = Xml.newSerializer();  
  3.     serializer.setOutput(outStream, "UTF-8");  
  4.     serializer.startDocument("UTF-8"true);  
  5.     serializer.startTag(null"persons");  
  6.     for(Person person : persons){  
  7.         serializer.startTag(null"person");  
  8.         serializer.attribute(null"id", person.getId().toString());  
  9.           
  10.         serializer.startTag(null"name");  
  11.         serializer.text(person.getName());  
  12.         serializer.endTag(null"name");  
  13.           
  14.         serializer.startTag(null"age");  
  15.         serializer.text(person.getAge().toString());  
  16.         serializer.endTag(null"age");  
  17.           
  18.         serializer.endTag(null"person");  
  19.     }  
  20.     serializer.endTag(null"persons");  
  21.     serializer.endDocument();  
  22.     outStream.flush();  
  23.     outStream.close();  
  24. }  

PS:网上资料提到相关bug有待验证。
      bug: 实现Xml.newPullParser()调用nextText()有个错误,nextText()并不总是向文档中所提到优先于END_TAG执行 。
第3个例子:
3.Android怎么把数据转成xml格式通过Socket发送
比如:String a=100;String b=100;想转成:<zuobiao><a>100</a><b>100</b></zuobiao>发送到服务端
public static String CreateXMLDoc() throws Exception{  ByteArrayOutputStream baos=new ByteArrayOutputStream();  XmlSerializer xml=Xml.newSerializer();  xml.setOutput(baos, "UTF-8");  xml.startDocument("UTF-8", null);   xml.startTag(null, "zuobiao");    xml.startTag(null, "a");  xml.text("100");  xml.endTag(null, "a");    xml.startTag(null, "b");  xml.text("100");  xml.endTag(null, "b");    xml.endTag(null, "zuobiao");  xml.endDocument();  byte[] xmlData=baos.toByteArray();  String xmlString=new String(xmlData,"UTF-8");  baos.flush();  baos.close();  baos=null;  return xmlString; } 最后,将这个函数返还的字符串转换成字节数组,用socket发送出去就行了。具体发送你自己发送就行了(或者你也可以直接返回xmlData字节数组,然后发送出去也行,具体看你定义的收发规则)。

0 0
原创粉丝点击