Java解析XML

Java解析XML有三种方式

1.DOM解析

 优点: 1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。

     2、解析过程中,树结构保存在内存中,方便修改。

   缺点:   1、由于文件是一次性读取,所以对内存的耗费比较大。

     2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

 XML:    (三种方式解析的都是一个XML)

<books>
    <!-- ctrl+shift+/ -->
    <book id="001" type="1">
        <bookName>钢铁是怎样练成的</bookName>
        <bookPrice>56</bookPrice>
        <bookAuthor>奥斯特洛夫斯基</bookAuthor>
        <bookPublisher>北大出版社</bookPublisher>
    </book>
    <book id="002" type="2">
        <bookName>你是人间的四月天</bookName>
        <bookPrice>86</bookPrice>
        <bookAuthor>林徽因</bookAuthor>
        <bookPublisher>徐志摩出版社</bookPublisher>
    </book>
    <book id="004">
        <bookPrice>22</bookPrice>
        <bookName>112</bookName>
    </book>
</books>

解析XML:

      //创建解析器
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder Builder=factory.newDocumentBuilder();
      //获取文档对象
        Document document = Builder.parse("book.xml");
      //节点集合
        NodeList node = document.getElementsByTagName("book");
        //循环解析
        for (int i = 0; i < node.getLength(); i++) {
        Element item =(Element) node.item(i);
        String bookid = item.getAttribute("id");
        String bookname = item.getAttribute("type");
        System.out.println(bookid+"\t"+bookname);
        }

在XML中添加元素

    private static void addXML() throws Exception{
//前面三步跟解析的一样 DocumentBuilderFactory factory
=DocumentBuilderFactory.newInstance(); DocumentBuilder Builder = factory.newDocumentBuilder(); Document document = Builder.parse("book.xml"); //创建根节点 Element book = document.createElement("book"); book.setAttribute("id","004"); //添加根节点下的其他元素 Element bookname = document.createElement("bookName"); bookname.setTextContent("lalal"); Element price = document.createElement("bookPrice"); price.setTextContent("22"); Element author = document.createElement("bookAuthor"); author.setTextContent("12"); Element publisher = document.createElement("bookPublisher"); publisher.setTextContent("44444"); //添加到book根节点中 book.appendChild(bookname); book.appendChild(price); book.appendChild(bookname); document.getElementsByTagName("books").item(0).appendChild(book); //写到硬盘中 TransformerFactory factory2=TransformerFactory.newInstance(); Transformer newTransformer = factory2.newTransformer(); Source source=new DOMSource(document); Result result=new StreamResult("book.xml"); newTransformer.transform(source, result); System.out.println("sava ok"); }

修改XML中的元素

    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder Builder = factory.newDocumentBuilder();
        Document document = Builder.parse("book.xml");
        
        //获取xml第几个根节点,根据需求更改item()中的值
        Element item =(Element) document.getElementsByTagName("books").item(3);
        document.getElementsByTagName("bookName").item(0).removeChild(item);
      
        TransformerFactory factory2=TransformerFactory.newInstance();
       Transformer newTransformer = factory2.newTransformer();
       Source source=new DOMSource(document);
       Result result=new StreamResult("book.xml");
       newTransformer.transform(source, result);
       System.out.println("Update ok");

删除xml中的元素

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder Builder = factory.newDocumentBuilder();
        Document document = Builder.parse("book.xml");
        
    //获取xml第几个根节点,根据需求更改item()中的值
       Node item = document.getElementsByTagName("book").item(1);
        document.getElementsByTagName("books").item(0).removeChild(item);
      
        TransformerFactory factory2=TransformerFactory.newInstance();
       Transformer newTransformer = factory2.newTransformer();
       Source source=new DOMSource(document);
       Result result=new StreamResult("book.xml");
       newTransformer.transform(source, result);
       System.out.println("dalete ok");    

2.使用DOM4J解析

 特征:        1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。

      2、它使用接口和抽象基本类方法。

      3、具有性能优异、灵活性好、功能强大和极端易用的特点。

      4、是一个开放源码的文件

在使用DOM4J解析,需要使用dom4j-1.6.1.jar架包

读取XML

     //和.NET 中
          //不需要借助工厂
           //01.解析器
           SAXReader reader=new SAXReader();
           //02.加载文档
           Document document = reader.read("src/book2.xml");
           //03.获取根节点
           Element root = document.getRootElement();
           //04.获取根节点下所有的直节点
           List<Element> list = root.elements();
           //05.遍历
           for (Element element : list) {
               //一个element代表一本书
               System.out.println( element.element("书名").getText());
               
              System.out.println( element.element("作者").attribute("name").getText());
             
           }

添加元素:

SAXReader reader=new SAXReader();
       //02.加载文档
       Document document = reader.read("src/book.xml");
       //03.获取根节点
       Element root = document.getRootElement();
       //04.获取根节点下所有的直节点
       List<Element> list = root.elements();
       //获取第一本书的对象
       //创建一个Element
       Element ele=DocumentHelper.createElement("出版时间");
       ele.setText("2015年5月21日17:35:09");
       list.get(0).add(ele);
       //没重新写入到xml文件中
       
       Writer writer=new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8");(尽量加上utf-8,否则会乱码
document.write(writer); writer.close();

修改XML元素

 SAXReader reader=new SAXReader();
       //02.加载文档
       Document document = reader.read("src/book.xml");
       //03.获取根节点
       Element root = document.getRootElement();
       List<Element> elements = root.elements();
       Element firstBook =  elements.get(1);
       Element bookname = firstBook.element("bookName");
       bookname.setText("22222");
       
       
       
       //写入硬盘
       Writer writer=new OutputStreamWriter(new FileOutputStream("src/book.xml"),"utf-8");
       document.write(writer);
       writer.close();
       System.out.println("modify ok!");

删除XML元素

   SAXReader reader=new SAXReader();
       //02.加载文档
       Document document = reader.read("src/book.xml");
       //03.获取根节点
       Element root = document.getRootElement();
       Element firstBook = root.element("book");
       Element delEle = firstBook.element("bookName");
       firstBook.remove(delEle);
       
       //写入硬盘
       Writer writer=new OutputStreamWriter(new FileOutputStream("src/book.xml"),"utf-8");
       document.write(writer);
       writer.close();

3.SAX解析

SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

    优点:

      1、采用事件驱动模式,对内存耗费比较小。

      2、适用于只处理XML文件中的数据时。

    缺点:

      1、编码比较麻烦。

      2、很难同时访问XML文件中的多处不同数据。

 

posted @ 2018-03-17 17:25  裸熊很酷  阅读(216)  评论(1编辑  收藏  举报