第一个例子:
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:当解析遇到元素的结束标识时,判断是否为一个完整数据的结束标识,若“是”则打包一条数据。
2.2、XmlSerializer序列化生成xml数据:
- public static List<Person> getPersons(InputStream xml) throws Exception {
- List<Person> persons = null;
- Person person = null;
- XmlPullParser pullParser = Xml.newPullParser();
- pullParser.setInput(xml, "UTF-8");
- int eventType = pullParser.getEventType();
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- case XmlPullParser.START_DOCUMENT:
- persons = new ArrayList<Person>();
- break;
- case XmlPullParser.START_TAG:
- if ("person".equals(pullParser.getName())) {
- int id = Integer.parseInt(pullParser.getAttributeValue(0));
- person = new Person();
- person.setId(id);
- }
- if ("name".equals(pullParser.getName())) {
- String name = pullParser.nextText();
- person.setName(name);
- }
- if ("age".equals(pullParser.getName())) {
- int age = Integer.parseInt(pullParser.nextText());
- person.setAge(age);
- }
- break;
- case XmlPullParser.END_TAG:
- if ("person".equals(pullParser.getName())) {
- persons.add(person);
- person = null;
- }
- break;
- }
- eventType = pullParser.next();
- }
- return persons;
- }
①serializer.setOutput(outStream, "UTF-8");给序列化器一个输出流。
②根据所需xml数据格式开始序列化生成xml数据。
- public static void createXml(List<Person> persons, OutputStream outStream) throws Exception {
- XmlSerializer serializer = Xml.newSerializer();
- serializer.setOutput(outStream, "UTF-8");
- serializer.startDocument("UTF-8", true);
- serializer.startTag(null, "persons");
- for(Person person : persons){
- serializer.startTag(null, "person");
- serializer.attribute(null, "id", person.getId().toString());
- serializer.startTag(null, "name");
- serializer.text(person.getName());
- serializer.endTag(null, "name");
- serializer.startTag(null, "age");
- serializer.text(person.getAge().toString());
- serializer.endTag(null, "age");
- serializer.endTag(null, "person");
- }
- serializer.endTag(null, "persons");
- serializer.endDocument();
- outStream.flush();
- outStream.close();
- }
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字节数组,然后发送出去也行,具体看你定义的收发规则)。