三种XML解析方式的简单使用

一:第一种DOM解析:

public class MainActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tv = (TextView) findViewById(R.id.tv);

    }
    
    
    public void btn(View view){
        List<Book> bookList = domResolver();
        
        tv.setText(bookList.toString());
        
    }
    

    /**
     * dom解析xml文档
     */
    public List<Book> domResolver(){
        
        try {
            //step1: 获取dom解析器工厂实例
            DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
            //step2 : 使用工厂实例创建一个dom解析器
            DocumentBuilder db = df.newDocumentBuilder();
            //step3 : 开始解析xml
            //判断一下sdcard是否存在
            File f = null;
            if(sdcardIsExist())
                f = new File(Environment.getExternalStorageDirectory(), "Books.xml");
            
            //开始解析xml文档
            Document document = db.parse(f);
            //获取一个Book标签
            NodeList nodeList = document.getElementsByTagName("Book");
            
            //StringBuffer sb = new StringBuffer();
            
            //创建一个集合
            List<Book> list = new ArrayList<Book>();
            
            //遍历nodeList集合
            for (int i = 0; i < nodeList.getLength(); i++) {
                
                Book book = new Book();
                
                Element element = (Element) nodeList.item(i);
                String name = element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
                String price = element.getElementsByTagName("price").item(0).getFirstChild().getNodeValue();
                String author = element.getElementsByTagName("author").item(0).getFirstChild().getNodeValue();
                
                book.setName(name);
                book.setPrice(price);
                book.setAuthor(author);
                
                list.add(book);
                //sb.append("姓名 : "+name+"\t价格 : "+price+"\t作者 : "+author+"\n");
            }
            
            //Toast.makeText(this, sb.toString(), 1).show();
            
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        
    }

    /**
     * 检测sdcard是否存在
     *
     * @return
     */
    private boolean sdcardIsExist() {

        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        } else {
            return false;
        }

    }

}


二:第二种Sax解析:

  
1):先继承一个Sax类:

public class SaxHandler extends DefaultHandler {
    
    
    private List<Book> bookList;
    private Book book;
    
    //定义一个标记,记住刚才那个标签名字
    private String preType = null;


    public List<Book> getBookList(InputStream is,SaxHandler saxHandler){
        
        try {
            //1.创建一个sax解析工程实例
            SAXParserFactory sf = SAXParserFactory.newInstance();
            //2.创建一个sax解析器
            SAXParser parser = sf.newSAXParser();
            //3.开始解析xml文档
            parser.parse(is, saxHandler);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return bookList;
    }
    
    
    @Override
    public void startDocument() throws SAXException {
        //开始解析document节点
        super.startDocument();
        //在开解析文档的时候,把这个集合初始化
        bookList = new ArrayList<Book>();
    }
    
    
    @Override
    public void endDocument() throws SAXException {
        //读取xml文档结束时回调的方法
        super.endDocument();
    }
    
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        //解析开始标签会执行的方法
        //uri  命名空间 (不用管)
        //localName  本地名称 (不用管)
        //qName  这个是标签/元素/节点名字
        super.startElement(uri, localName, qName, attributes);
        
        if("Book".equals(qName)){
            book = new Book();
        }
        //记住标签名字
        preType = qName;
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        //读到结束标签会调用的方法
        if("Book".equals(qName)){
            bookList.add(book);
        }
        preType = null;
        super.endElement(uri, localName, qName);
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //解析文本会执行的方法
        String content = new String(ch, start, length);
        //判断是哪一个标签的文本
        if("name".equals(preType)){
            book.setName(content);
        }else if("price".equals(preType)){
            book.setPrice(content);
        }else if("author".equals(preType)){
            book.setAuthor(content);
        }
        super.characters(ch, start, length);
    }
}


2):随后调用:

public class MainActivity extends Activity {
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       tv = (TextView) findViewById(R.id.tv);
    }
    public void btn(View view){
        try {
            SaxHandler saxHandler = new SaxHandler();
            InputStream is = getAssets().open("Books.xml");
            List<Book> bookList = saxHandler.getBookList(is, saxHandler);
            
            tv.setText(bookList.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}






三:第三种PULL解析:


public class MainActivity extends Activity implements OnClickListener {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

    }

    private void initView() {
        findViewById(R.id.btn).setOnClickListener(this);
        findViewById(R.id.btn1).setOnClickListener(this);
        tv = (TextView) findViewById(R.id.tv);

    }

    /**
     * 使用android内置pull解析器进行解析
     */
    private List<Book> pullResolver() {

        try {
            // 创建一个pull解析器实例
            XmlPullParser parser = Xml.newPullParser();

            // 设置这个文件以什么样的编码格式输入到内存中
            InputStream is = getAssets().open("Books.xml");
            parser.setInput(is, "utf-8");
            // 开始解析xml文档
            int type = parser.getEventType();
            // 逐行扫描xml,如果parser解析到这个事件!= END_DOCUMENT

            // 创建一个集合
            List<Book> bookList = null;

            // 创建一个javaBean
            Book book = null;
            while (type != XmlPullParser.END_DOCUMENT) {

                switch (type) {
                case XmlPullParser.START_TAG:
                    if ("Books".equals(parser.getName())) {
                        bookList = new ArrayList<Book>();
                    } else if ("Book".equals(parser.getName())) {
                        book = new Book();
                    } else if ("name".equals(parser.getName())) {
                        // 获取这个标签里面的值
                        // parser.getAttributeName(0);获取Book标签中的某一个属性
                        String name = parser.nextText();
                        book.setName(name);
                    } else if ("price".equals(parser.getName())) {
                        String price = parser.nextText();
                        book.setPrice(price);
                    } else if ("author".equals(parser.getName())) {
                        String author = parser.nextText();
                        book.setAuthor(author);
                    }
                    break;

                case XmlPullParser.END_TAG:// 结束标签
                    if ("Book".equals(parser.getName())) {
                        // 将javaBean存到这个集合里
                        bookList.add(book);
                    }
                    break;
                }
                // 往下移动一行 这一行千万不漏掉了
                type = parser.next();
            }
            return bookList;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }
    
    /**
     * 将书本信息用一个xml保存起来
     *
     */
    private boolean saveBookToXml(List<Book> list){
        
        try {
            //创建一个序列化器实例
            XmlSerializer serializer = Xml.newSerializer();
            //设置这个数据以什么样的编码格式输出
            File file = new File(Environment.getExternalStorageDirectory(), "Book2.xml");
            OutputStream os = new FileOutputStream(file);
            serializer.setOutput(os, "utf-8");
            //<?xml version="1.0" encoding="UTF-8"?> 开始写入文档声明
            serializer.startDocument("utf-8", false);
            //设置缩进模式
            
            //开始写一个标签
            serializer.startTag("", "Books");
             for (Book book : list) {
                 serializer.startTag("", "Book");
                    //serializer.setProperty("id", "1");
                        serializer.startTag("", "name");
                        serializer.text(book.getName());
                        serializer.endTag("", "name");
                        
                        serializer.startTag("", "price");
                        serializer.text(book.getPrice());
                        serializer.endTag("", "price");
                        
                        serializer.startTag("", "author");
                        serializer.text(book.getAuthor());
                        serializer.endTag("", "author");
                
                      serializer.endTag("", "Book");
            }
                serializer.endTag("", "Books");
                //文档写入完毕
                serializer.endDocument();
                
            return true;
            
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        
        
    }
    
    
    
    

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
        case R.id.btn: {
            List<Book> books = pullResolver();
            // 为了演示,我就toString了
            tv.setText(books.toString());
        }
            break;

        case R.id.btn1:
        {
            
            boolean result = saveBookToXml(pullResolver());
            if(result){
                Toast.makeText(this, "写入成功", 1).show();
            }else{
                Toast.makeText(this, "写入失败", 1).show();
            }
            
        }
            break;
        }

    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值