package com.example.xmldata; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.util.Xml; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); //使用pull工具类将一个实体类对象转换成xml文件 pullToXml(); //使用pull工具类解析XML文件 pullParseXml(); //使用Dom4j进行Xml文件的解析 dom4jParseXml(); } /* 使用pull工具类将一个实体类对象转换成xml文件 */ private void pullToXml() { try { List<Weather> weathers=new ArrayList<>(); weathers.add(new Weather(1,2,"晴","北京","2~3级")); weathers.add(new Weather(2,20," 晴","南京","3级")); weathers.add(new Weather(3,-8,"小雪","包头","5~6级")); weathers.add(new Weather(4,13,"晴转阴","周口","2~4级")); XmlSerializer serializer = Xml.newSerializer(); //获取生成XNL文件的序列化器对象 OutputStream os= openFileOutput("myxmls", MODE_WORLD_WRITEABLE); //设置XMl文件生成后存放的位置 OutputStreamWriter writer=new OutputStreamWriter(os); serializer.setOutput(writer); //开始写入文件 serializer.startDocument("UTF-8",null); //开始生成xml格式文件,并设置编码格式为“utf-8”,并且元素是可独立的 serializer.startTag(null,"weathers"); //设置xml文件根元素 并将前缀设为null //设置一个开始主标签,且将书签的前缀设为null for(Weather weather:weathers){ serializer.startTag(null,"weather");//设置xml文件一级元素 并将前缀设为null serializer.attribute(null,"id",weather.getId().toString()); serializer.startTag(null,"temperature"); //设置xml文件二级元素 并将前缀设为null serializer.text(weather.getTemperature().toString()); //为二级元素赋值 serializer.endTag(null,"temperature"); //结束当前的二级元素标签 serializer.startTag(null,"city"); serializer.text(weather.getCity()); serializer.endTag(null,"city"); serializer.startTag(null,"state"); serializer.text(weather.getState()); serializer.endTag(null,"state"); serializer.startTag(null,"wind"); serializer.text(weather.getWind()); serializer.endTag(null,"wind"); serializer.endTag(null,"weather"); } serializer.endTag(null,"weathers"); serializer.endDocument(); //结束xml文件的编译 writer.flush(); writer.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /* 使用pull工具类解析XML文件 */ private List<Weather> pullParseXml() { List<Weather> weathers=null; Weather weather=null; try { XmlPullParser parse = Xml.newPullParser(); //获取解析XNL文件的解析器对象 InputStream is = openFileInput("myxmls"); parse.setInput(is,"UTF-8"); int eventType = parse.getEventType(); if(!(eventType==XmlPullParser.END_DOCUMENT)){ String name=parse.getName();//获取解析器当前指向的节点元素的名字 switch (eventType){ case XmlPullParser.START_DOCUMENT: weathers=new ArrayList<>(); break; case XmlPullParser.START_TAG: weather=new Weather(); if("weather".equals(name)){ weather.setId(Integer.parseInt(parse.getAttributeName(0))); }else if("temperature".equals(name)){ weather.setTemperature(Integer.parseInt(parse.nextText())); }else if("city".equals(name)){ weather.setCity(parse.nextText()); }else if("wind".equals(name)){ weather.setWind(parse.nextText()); } break; case XmlPullParser.END_DOCUMENT: if("weathers".equals(name)){ weathers.add(weather); weather=null; } break; } eventType=parse.next(); return weathers; } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return weathers; } /* 使用Dom4j进行Xml文件的解析 */ private void dom4jParseXml() { try { SAXReader reader=new SAXReader(); //创建saxReader 对象 Document document = reader.read(openFileInput("myxmls")); //读取传入的xml文件,并转换成Document对象 Element node = document.getRootElement(); //获取根节点元素对象 Element element = node.element("weather"); //获取名字为“weather”的字节点 Attribute attr = element.attribute("id"); //获取"weather"字节点的属性值 element.remove(attr); //删除属性值 element.addAttribute("城市排名","2"); //添加属性 Element newElement = element.addElement("雾霾");//添加新的元素 newElement.setText("严重有霾"); //为新添加的元素赋值 element.addCDATA("这是一个城市天气的XML数据"); // 添加标记语句 writeData(document,node);// 将上述修改的数据写入到Xml文件中 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } } /* 将修改的数据写入到Xml文件中 */ private void writeData(Document document,Element node) throws FileNotFoundException { try { OutputFormat format= OutputFormat.createPrettyPrint(); //排版缩进的格 format.setEncoding("UTF-8"); //设置编码格式 XMLWriter write=new XMLWriter(new OutputStreamWriter(openFileOutput("myxmls",MODE_WORLD_WRITEABLE)),format); write.write(document); //开始写入 write.flush(); write.close(); } catch (IOException e) { e.printStackTrace(); } // 开始读取修改后的xml文件 遍历读取当前节点元素下的所有(元素)的子节点 listNodes(node); } /* 遍历读取当前节点元素下的所有(元素)的子节点 */ private void listNodes(Element node) { List<Attribute> attributes= node.attributes(); //获取当前节点的所有属性 for(Attribute attr:attributes){ //遍历当前节点元素的属性 Log.i("show",node.getName()+"节点元素的属性:"+attr.getName()+":"+attr.getValue()); } if(!(node.getTextTrim().equals(""))){ Log.i("show",node.getName()+"节点内容"+node.getText()); } Iterator<Element> iterator=node.elementIterator(); //获取当前节点元素下的子节点元素的迭代器 while (iterator.hasNext()){ Element element= iterator.next(); //获取某一个子节点对象 listNodes(element); //使用递归,再次对当前的子节点元素进行遍历 } } }
package com.example.xmldata; /** * 封装一个天气的实体类数据 */ public class Weather { private Integer id; private Integer temperature; private String state; private String city; private String wind; public Weather() { } public Weather(Integer id, Integer temperature, String state, String city, String wind) { this.id = id; this.temperature = temperature; this.state = state; this.city = city; this.wind = wind; } public void setId(Integer id) { this.id = id; } public void setTemperature(Integer temperature) { this.temperature = temperature; } public void setState(String state) { this.state = state; } public void setCity(String city) { this.city = city; } public void setWind(String wind) { this.wind = wind; } public Integer getId() { return id; } public Integer getTemperature() { return temperature; } public String getState() { return state; } public String getCity() { return city; } public String getWind() { return wind; } @Override public String toString() { return city+"今天天气:温度"+temperature+",风速"+wind+","+state; } }