zoukankan      html  css  js  c++  java
  • JavaWeb学习日记----XML的解析

    XML的解析简介:

      在学习JavaScript时,我们用的DOM来解析HEML文档,根据HTML的层级结构在内存中分配一个树形结构,把HTML的标签啊,属性啊和文本之类的都封装成对象。

      比如:document对象,element对象,属性对象,文本对象,Node结点对象

    我们通常有两种方式来解析XML:DOM和SAX

      DOM解析方式:

        其实跟HTML差不多的,也是根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本都封装成对象。

        缺点:如果文件过大的话,就和造成内存溢出。

        优点:可以很方便实现增删改操作。

      SAX解析方式:

        采用事件驱动,从上到下,一行一行的解析,边读边解析。解析到某一个对象时,返回对象名称。

        缺点:不能实现增删改操作

        优点:不会内存溢出,可以方便实现查询操作。

    解析器:

      在解析XML时,需要解析器。针对DOM和SAX,不同的公司和组织向我们提供了不同的解析器。

      SUN公司:      jaxp

      dom4j组织:    dom4j 

      jdom组织 :     jdom

      在实际开发中,dom4j用的最多

    jaxp:

      jaxp解析器在JDK的javax.xml.parsers包里面。针对dom和sax分别提供了解析器:

        dom:  DocumentBuilder:  解析器类

            DocumentBuilderFactory:  解析器工厂类

        sax:  SAXParser:  解析器类

            SAXParserFactory:  解析器工厂类

    那么我们具体获得JAXP中的DOM解析器的方法如下:

      调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂。

      调用工厂对象的newDocumentBuilder()方法得到解析器对象。

      调用解析器对象的parse()方法解析XML文档,该方法的参数为XML文档的URL或者封装了XML路径的文件对象。即:parse(String uri)  parse(File f)

      示例:

         // 创建解析器工厂
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            // 获得解析器
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            // 解析目标XML文件
            Document document = documentBuilder.parse("src/OnePiece.xml");

    通过上述步骤我们就能得到代表整个文档的Document对象,就可以利用DOM特性对整个XML文档进行操纵了。

      Document接口中常用的方法:

      

     NodeList getElementsByTagName(String tagname)     按文档顺序返回包含在文档中且具有给定标记名称的所Element的 NodeList。 
     Element createElement(String tagName)          创建指定类型的元素。     
     Text createTextNode(String data)              创建给定指定字符串的 Text 节点。 

      Document的父接口Node中常用的方法:

    Node appendChild(Node newChild) 
              将节点 newChild 添加到此节点的子节点列表的末尾。 
    Node removeChild(Node oldChild) 
              从子节点列表中移除 oldChild 所指示的子节点,并将其返回。 
     Node getParentNode() 
              此节点的父节点。
    String getTextContent() 
              此属性返回此节点及其后代的文本内容。 
    void setTextContent(String textContent) 
              此属性返回此节点及其后代的文本内容。 
    
    

      在得到的NodeList集合中有下列方法可以实现遍历:

    int getLength() 
              列表中的节点数。 
     Node item(int index) 
              返回集合中的第 index 个项。 

     在对Document对象进行更新操作时,都是在内存中进行的。如果想要更直观地显示在XML文档中,需要进行回写操作。即:把Document对象又重新写入到XML文件中。

    示例:

    现有一个XML文档内容如下:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <海贼王>
        <草帽海贼团>
            <船长>路飞</船长>
            <厨师>山治</厨师>
            <航海士>娜美</航海士>
            <船医>乔巴</船医>
            <音乐家>贝多芬</音乐家>
            
        </草帽海贼团>
        <草帽海贼团>
            <副船长>索隆</副船长>
            <考古学家>罗宾</考古学家>
            <狙击手>乌索普</狙击手>
            <船工>弗兰奇</船工>
        </草帽海贼团>
    </海贼王>

    需求:将第一个<草帽海贼团>下面的<音乐家>内容贝多芬改为布鲁克

    代码如下:

    package com.alex;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    /*
     * 将第一个<草帽海贼团>下面的<音乐家>内容贝多芬改为布鲁克
     */
    public class OnePieceTest3 {
        public static void main(String[] args) throws Exception {
            // 创建解析器
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            // 解析目标XML文件
            Document document = documentBuilder.parse("src/OnePiece.xml");
    
            // 获得目标元素集合
            NodeList list = document.getElementsByTagName("草帽海贼团");
    
            Node node = list.item(0);
            NodeList childNodes = node.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node node2 = childNodes.item(j);
                String nodeName = node2.getNodeName();
                if (nodeName.equals("音乐家"))
                    node2.setTextContent("布鲁克");
            }
            // 回写
            // 创建转换器
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.transform(new DOMSource(document), new StreamResult("src/OnePiece.xml"));
        }
    }

     修改后XML文档内容如下:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <海贼王>
        <草帽海贼团>
            <船长>路飞</船长>
            <厨师>山治</厨师>
            <航海士>娜美</航海士>
            <船医>乔巴</船医>
            <音乐家>布鲁克</音乐家>
        </草帽海贼团>
        <草帽海贼团>
            <副船长>索隆</副船长>
            <考古学家>罗宾</考古学家>
            <狙击手>乌索普</狙击手>
            <船工>弗兰奇</船工>
        </草帽海贼团>
    </海贼王>

    2019-04-05

       

  • 相关阅读:
    call,apply和bind的用法及区别
    JavaScript数组去重的方法
    JavaScript原型与原型链
    判断数组的方法
    两栏布局和三栏布局的实现
    小作品
    CSS垂直居中的方法
    闭包实现add(1)(2), add(1,2)的功能
    1.JavaScript的组成
    常用指令
  • 原文地址:https://www.cnblogs.com/fxxk/p/10660291.html
Copyright © 2011-2022 走看看