Xml文件的解析与生成(pull解析和Dom4j解析)

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;
    }
}

 
 
 
 
 
 
 
 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值