java里面4种关于xml的解析方法

以下资料来源于 imooc
imooc学习资料:http://www.imooc.com/learn/171

推荐大家使用第四种方法;;;
4中关于解析xml的方法:
DOM,SAX ( java 里面提供包 )

JDOM,DOM4J ( 需要自己导入包文件 )


1:DOM

package com.sdingba.xmlparser;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.List;
/**
 * Created by su on 16-4-30.
 *
 * DOM解析  xml文件
 *
 * 一次性加载内存
 * 优点:
 *      形成树的结构,直观好理解,代码更容易编写
 *      解析过程中树结构保留在内存中,方便修改
 *
 * 缺点:
 *      当xml文件较大时,对内存的消耗不比较大,
 *      容易影响解析性能,并赵成内存溢出
 */
public class DOM {

    public static void main(String[] args) {
        //创建一个DocumentBuilderFactory对象
        DocumentBuilderFactory dbf =
                DocumentBuilderFactory.newInstance();


        //创建一个DocumentBuilder对象
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();

            //通过DocumentBuilder对象的parse解析,加载xml文件
            Document document = db.parse("new.xml");

            //获取所有book的集合
            NodeList bookList = document.getElementsByTagName("book");

            for (int i=0;i<bookList.getLength();i++) {
//                通过  获取一个book的数据
                Node books = (Node) bookList.item(i);
                //获取book节点的所有属性的集合
                NamedNodeMap attrs = books.getAttributes();
                //遍历book的属性,
                for (int j = 0; j < attrs.getLength(); j++) {
                    //通过item获取某一个属性
                    attrs.item(j).getNodeName();
                    //获取属性值  getNodeValue();
                    System.out.println("id == "+attrs.item(j).getNodeValue());
                }

//                //前提book节点 有且只有一个:
//                Element book = (Element) bookList.item(i);
//                 //sttrValue 为 book里面的id值
//                String attrValue = book.getAttribute("id");
//                System.out.println(attrValue);

                NodeList chileNodes = books.getChildNodes();
                //遍历chileNode的节点和节点名
                for (int k = 0; k < chileNodes.getLength(); k++) {
                    //区分text类型的node以及element的类型
                    if (chileNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
                        //获取的element类型的节点的节点名
                        String aa = chileNodes.item(k).getNodeName();
                        System.out.print(aa+"   =====    :      ");
                        //bb2   为空;
                        String bb2 = chileNodes.item(k).getNodeValue();

                        String bb = chileNodes.item(k).getFirstChild().getNodeValue();
//                        String bb = chileNodes.item(k).getTextContent();
                        System.out.println(bb);
                    }
                }
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2,SAX

package com.sdingba.xmlparser;

import com.sdingba.javabean.Book;
import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import com.sun.xml.internal.bind.v2.model.core.ID;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.util.ArrayList;

/**
 * Created by su on 16-4-30.
 * Handler  解析原理
 *
 * 基于事件的解析,一条一条的解析
 *
 * 优点:
 *      采用事件驱动模式,对内存的消耗比较小
 *      适合于只需要处理xml数据时
 * 缺点,不易编码
 *      很难同时访问一个xml中的多个不同的数据
 */
public class SAX {
    public static void main(String[] args) {

        //1.通过SAXparserFactory 的实例
        SAXParserFactory factory = SAXParserFactory.newInstance();

        try {
            //通过factory获取SAXParser的实例
            SAXParser parser = factory.newSAXParser();

            SAXParserHandler handler = new SAXParserHandler();
            parser.parse("new.xml", handler);

            int a = handler.getBookList().size();
            for (Book book : handler.getBookList()) {
                System.out.println("id = "+book.getId());
                System.out.println(book.getName());
                System.out.println(book.getAuthor());
                System.out.println(book.getYear());
                System.out.println(book.getPrice());
                System.out.println(book.getLanguage());
                System.out.println("-------finish-------");
            }

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    static class SAXParserHandler extends DefaultHandler {
        Book book;

        public ArrayList<Book> getBookList() {
            return bookList;
        }

        public void setBookList(ArrayList<Book> bookList) {
            this.bookList = bookList;
        }

        private  ArrayList<Book> bookList = new ArrayList<Book>();
        String value = null;
        private int bookIndex = 0;

        /**
         * 解析开始
         *
         * @throws SAXException
         */
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            System.out.println("解析开始");
        }

        /**
         * 解析结束
         *
         * @throws SAXException
         */
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
            System.out.println("解析结束");
        }


        /**
         * 用来遍历xml文件的开始标签
         *
         * @throws SAXException
         */
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
//
            if (qName.equals("book")) {
                bookIndex++;
                book = new Book();
                System.out.println("开始第" + bookIndex + "本书的解析======");
                //以知 book元素的属性
                String value = attributes.getValue("id");
                System.out.println("book+" + value);//book+2

                //如果不知道book元素的属性值
                int num = attributes.getLength();
                for (int i = 0; i < num; i++) {
                    System.out.println(attributes.getQName(i));//属性名 id
                    System.out.println("属性值“===" + attributes.getValue(i));
                    if (attributes.getQName(i).equals("id")) {
                        book.setId(attributes.getValue(i));
                    }
                }
            } else if (!qName.equals("book") && !qName.equals("bookstore")) {
                System.out.println("节点名”" + qName);

            }
        }

        /**
         * 用来遍历xml文件的结束标签
         *
         * @throws SAXException
         */
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            //调用DefaultHandler类的startElement方法;
            super.endElement(uri, localName, qName);
            //判断是否针对一本书进行遍历
            if (qName.equals("book")) {
                bookList.add(book);
                book = null;
                System.out.println("=====结束" + bookIndex + "的解析");
            } else if (qName.equals("name")) {
                book.setName(value);
            } else if (qName.equals("author")) {
                book.setAuthor(value);
            } else if (qName.equals("year")) {
                book.setYear(value);
            } else if (qName.equals("price")) {
                book.setPrice(value);
            } else if (qName.equals("language")) {
                book.setLanguage(value);
            }

        }


        /**
         * @param ch ,,整个共享xml文档的内容
         *           start 开始节点
         *           length 长度
         */
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            value = new String(ch, start, length);
            if (!value.trim().equals("")) {
                System.out.println("节点值是::" + value);
            }
        }
    }

}

3,JDOM

package com.sdingba.xmlparser;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * Created by su on 16-5-1.
 * 不是java官方提高的,。需要导入jar包
 *
 *
 *
 */
public class JDOM {

    public static void main(String[] args) {

        //进行对new。xml文件的解析
        //1,
        SAXBuilder saxBuilder = new SAXBuilder();


        try {
            //2,创建一个输入流
            InputStream in = new FileInputStream("new.xml");
            //3,通过saxBuiler的build的方法,将输入流加载到sax里面
            Document document = saxBuilder.build(in);
            //通过decument对象,。获取xml文件的根节点
            Element rootElement = document.getRootElement();
            //获取根节点下的子节点,集合
            List<Element> booklist = rootElement.getChildren();
            //继续进行解析
            for (Element book : booklist) {
                System.out.println("开始解析第" +
                        booklist.indexOf(book) + 1 + "本书=====");

                //解析book的属性,
                List<Attribute> attrList = book.getAttributes();
                  /*
                    //如果知道属性值的时候,可以选择下面这行代码获取属性值
                    String aaaa = book.getAttributeValue("id");
                     System.out.println(aaaa);  //aaaa  = 1,和下面的for循环里面的一样效果
                  */
                //遍历属性名,针对不清楚book下的属性值
                for (Attribute attribute : attrList) {
                    //获取属性名
                    String attrName = attribute.getName();
                    //获取属性值
                    String attrValue = attribute.getValue();
                    System.out.println(attrName + "---" + attrValue);

                }
                //对book节点的子节点的节点名以及节点值进行遍历
                List<Element> bookChilds = book.getChildren();
                for (Element chile : bookChilds) {
                    String name = chile.getName();
                    String value = chile.getValue();
                    System.out.print(name+"    ----   ");
                    System.out.println(value);
                }
                //对book节点的子节点的节点名和接地安置
                System.out.println("结束解析第" +
                        booklist.indexOf(book) + 1 + "本书=====");
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4,DOM4J

package com.sdingba.xmlparser;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


import java.io.File;
import java.util.Iterator;
import java.util.List;

/**
 * Created by su on 16-5-1.
 * jdom的一种智能分支,
 *
 */
public class Dom4J {
    public static void main(String[] args) {
        //创建SAXReader的duixaing
        SAXReader reader = new SAXReader();
        //通富哦reader对象read
        try {
//          Document document = reader.read("new.xml");
            Document document = reader.read(new File("new.xml"));


            //通过document对象获取根节点
            Element bookStore = document.getRootElement();

           /* //如果你知道很多属性,只要求获取某些属性
            String bookname = bookStore.element("book").element("name").getText();
            System.out.println(bookname);//直接打印书名:你是我的女神
            */
            //通过elementIterator方法获取迭代器
            Iterator<Element> it = bookStore.elementIterator();
            //遍历迭代器
            while (it.hasNext()) {
                System.out.println("======开始遍历莫一本书");
                Element book = (Element) it.next();
                //获取book的属性名和属性值
                List<Attribute> bookAttrs = book.attributes();
                for (Attribute attr : bookAttrs) {
                    String name = attr.getName();
                    String vale = attr.getValue();
                    System.out.println(name + "---" + vale);
                }
                Iterator iit = book.elementIterator();
                while (iit.hasNext()) {
                    Element bookClild = (Element) iit.next();
                    String value = bookClild.getStringValue();
                    String name = bookClild.getName();
                    System.out.println(name + "=---=" + value);
                }
                System.out.println("======结束遍历某一本书");
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

DOM4J 其他的方式:


     //创建SAXReader的duixaing
        SAXReader reader = new SAXReader();
        //通富哦reader对象read
        try {
//          Document document = reader.read("new.xml");
            Document document = reader.read(new File("new.xml"));


            //通过document对象获取根节点
            Element bookStore = document.getRootElement();
 List<Element> elementList = bookStore.elements();
            for (Element ele : elementList) {
                List<Element> elementss = ele.elements();
//                String value1 = ele.getText();
//                String value = ele.getStringValue();//
//                String name = ele.getName();
//                System.out.println(value);
                System.out.println();
                for (Element eles : elementss) {
                    String val = eles.getText();
                    String namenode = eles.getName();
                    System.out.println(namenode + " ==== " + val);
                }
            }

下面的xml文件是上面的四段代码解析的文件;

<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
    <book id="1">
        <name>你是我的女神</name>
        <author>sdingba</author>
        <year>2016</year>
        <price>89</price>
    </book>
    <book id="2">
        <name>你是我的女神2</name>
        <author>sdingba2</author>
        <year>2017</year>
        <price>88</price>
    </book>
</bookstore>

ssssssssssssssssssssssssssssssssssssssssssss



<?xml version="1.0" encoding="UTF-8"?>

<书架> 
  <> 
    <书名>Java就业培训教程</书名>  
    <作者></作者>  
    <售价>39.00元</售价> 
  </>  
  <> 
    <书名>JavaScript网页开发</书名>  
    <作者></作者>  
    <售价>28.00元</售价> 
  </> 
</书架>
    public static void main(String[] args) throws Exception {
        //如果实在 web中
//      1,      InputStream aaInputStream =     request.getInputStream();
//      2,      SAXReader reader = new SAXReader();
//     3,       Document dom = reader.read(aaInputStream);
        //1.获取解析器
        SAXReader reader = new SAXReader();
        //2.解析xml获取代表整个文档的dom对象
        Document dom = reader.read("book.xml");

        //3.获取根节点
        Element root = dom.getRootElement();

        //4.获取书名进行打印
        String bookName = root.element("书").element("书名").getText();
        System.out.println(bookName);
    }
    @Test
    public void attr() throws Exception{
        SAXReader reader = new SAXReader();
        Document dom = reader.read("book.xml");
        Element root = dom.getRootElement();

        Element bookEle = root.element("书");
        //bookEle.addAttribute("出版社", "传智出版社");
//      String str = bookEle.attributeValue("出版社");
//      System.out.println(str);
        Attribute attr = bookEle.attribute("出版社");
        attr.getParent().remove(attr);

        XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
        writer.write(dom);
        writer.close();
    }

    @Test
    public void del() throws Exception{
        SAXReader reader = new SAXReader();
        Document dom = reader.read("book.xml");
        Element root = dom.getRootElement();

        Element price2Ele = root.element("书").element("特价");
        price2Ele.getParent().remove(price2Ele);

        XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
        writer.write(dom);
        writer.close();
    }

    @Test
    public void update()throws Exception{
        SAXReader reader = new SAXReader();
        Document dom = reader.read("book.xml");
        Element root = dom.getRootElement();

        root.element("书").element("特价").setText("4.0元");

        XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
        writer.write(dom);
        writer.close();
    }

    @Test
    public void add()throws Exception{
        SAXReader reader = new SAXReader();
        Document dom = reader.read("book.xml");
        Element root = dom.getRootElement();
        //凭空创建<特价>节点,设置标签体
        Element price2Ele = DocumentHelper.createElement("特价");
        price2Ele.setText("40.0元");
        //获取父标签<书>将特价节点挂载上去
        Element bookEle = root.element("书");
        bookEle.add(price2Ele);

        //将内存中的dom树会写到xml文件中,从而使xml中的数据进行更新
//      FileWriter writer = new FileWriter("book.xml");
//      dom.write(writer);
//      writer.flush();
//      writer.close();
        XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
        writer.write(dom);
        writer.close();
    }

    @Test
    public void find() throws Exception{
        SAXReader reader = new SAXReader();
        Document dom = reader.read("book.xml");
        Element root = dom.getRootElement();

        List<Element> list =  root.elements();
        Element book2Ele = list.get(1);
        System.out.println(book2Ele.element("书名").getText());

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值