zoukankan      html  css  js  c++  java
  • 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+"	"+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文件中的多处不同数据。

  • 相关阅读:
    2020.04.11【NOIP普及组】模拟赛C组25总结
    【华为云技术分享】云图说 | 容器交付流水线ContainerOps,提升持续交付效率
    【USACO 2020 January Silver】Wormhole Sort 题解
    【华为云技术分享】计算python程序执行时间
    HTAP会成为数据库的未来吗?
    【华为云技术分享】现代富文本编辑器Quill的模块化机制
    Cow Evolution 题解
    【USACO 2020 January Silver】Loan Repayment
    VS2012 黑色护眼主题
    常用的正则表达式
  • 原文地址:https://www.cnblogs.com/luoxionghenku/p/8591167.html
Copyright © 2011-2022 走看看