JAXP进行DOM解析的实践

  比较重要的几个类,使用频率比较高的就是Document, Element与Node.

  几个常用的套路:

    static {
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            builder = dbFactory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
    }

  当需要进行增删改的操作时:

        /**
         * 获取更新对象
         */
        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        /**
         * 构建源与目标
         */
        Source source = new DOMSource(document);
        Result result = new StreamResult("src/main/resources/book.xml");
        tf.transform(source, result);

  整个代码:

package com.changjiang.test.RFP01.testXML;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
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.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class JaxpDemo {

    private static DocumentBuilder builder;

    static {
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            builder = dbFactory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
    }

    public static void printLine() {
        System.out.println("====================================================");
    }

    /**
     * 根据标签名称获得标签里内容,越过了层级
     *
     * @param document
     */
    public static void getContentFromNode(Document document) {
        NodeList nl = document.getElementsByTagName("作者");
        for (int i = 0; i < nl.getLength(); i++) {
            Node n = nl.item(i);
            System.out.println(n.getTextContent());
        }
    }

    /**
     * 获取根节点
     *
     * @param document
     */
    public static void getRootNode(Document document) {
        System.out.println(document.getDocumentElement().getTagName());
    }

    public static void getAllNodes(Node node) {
        /**
         * 确定是否为元素
         */

        if (node.getNodeType() == Node.ELEMENT_NODE) {
            System.out.println("node.getNodeType()==Node.ELEMENT_NODE 判断为元素");
        }

        if (node instanceof Element) {
            System.out.println("node instanceof Element 判断为元素");
            Element e = (Element) node;
            System.out.println(e.getNodeName());
        }
        NodeList nl = node.getChildNodes();
        for (int i = 0; i < nl.getLength(); i++) {
            Node childNode = nl.item(i);
            getAllNodes(childNode);
        }
    }

    /**
     * 更新节点内容
     *
     * @param document
     * @throws TransformerException
     */
    public static void modifyNodeContent(Document document) throws TransformerException {
        Node priceNode = document.getElementsByTagName("售价").item(0);
        priceNode.setTextContent("55");

        /**
         * 获取更新对象
         */
        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        /**
         * 构建源与目标
         */
        Source source = new DOMSource(document);
        Result result = new StreamResult("src/main/resources/book.xml");
        tf.transform(source, result);
    }

    /**
     * 添加节点到同级目录的结尾
     *
     * @param document
     * @throws TransformerException
     */
    public static void addNode(Document document) throws TransformerException {
        Element e = document.createElement("年代");
        e.setTextContent("2014");

        Node n = document.getElementsByTagName("书").item(0);
        n.appendChild(e);

        /**
         * 获取更新对象
         */
        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        /**
         * 构建源与目标
         */
        Source source = new DOMSource(document);
        Result result = new StreamResult("src/main/resources/book.xml");
        tf.transform(source, result);
    }

    /**
     * 添加节点到指定的同级节点之前
     * @param document
     * @throws TransformerException
     */
    public static void addBeforeNode(Document document) throws TransformerException {
        Element e = document.createElement("年代");
        e.setTextContent("2014");
        /**
         * 父节点.insertBefore(新节点,参考节点)
         */
        Node n = document.getElementsByTagName("书名").item(0);
        Node parent = n.getParentNode();
        parent.insertBefore(e, n);
        /**
         * 获取更新对象
         */
        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        /**
         * 构建源与目标
         */
        Source source = new DOMSource(document);
        Result result = new StreamResult("src/main/resources/book.xml");
        tf.transform(source, result);
    }

    /**
     * 删除指定元素节点
     *
     * @throws TransformerException
     */
    public static void deleteNode(Document document) throws TransformerException {
        Node yearNode = document.getElementsByTagName("年代").item(0);
        yearNode.getParentNode().removeChild(yearNode);
        /**
         * 获取更新对象
         */
        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        /**
         * 构建源与目标
         */
        Source source = new DOMSource(document);
        Result result = new StreamResult("src/main/resources/book.xml");
        tf.transform(source, result);
    }

    /**
     * 获取节点的属性
     *
     * @param document
     */
    public static void getNodeAttribute(Document document) {
        Node bookNode = document.getElementsByTagName("书").item(0);
        if (bookNode instanceof Element) {
            Element e = (Element) bookNode;
            System.out.println(e.getAttribute("ISBN"));
        }
    }

    /**
     * 重新设置节点属性的内容
     * @param document
     * @throws TransformerException
     */
    public static void setNodeAttribute(Document document) throws TransformerException {
        Node bookNode = document.getElementsByTagName("书").item(0);
        if (bookNode instanceof Element) {
            Element e = (Element) bookNode;
            e.setAttribute("ISBN", "RFW000001");
        }
        /**
         * 获取更新对象
         */
        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        /**
         * 构建源与目标
         */
        Source source = new DOMSource(document);
        Result result = new StreamResult("src/main/resources/book.xml");
        tf.transform(source, result);
    }

}

  DOM解析时,整个XML文件会被加载到内存中,所以当XML文件特别大时,会造成内存的溢出。

  针对这种情况,SAX解析可以做到在读取XML文档时,就对文档内容进行处理,而不必等到整个文件装载完毕才对文件进行操作。

=================================================>

  SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器: 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。 解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法 时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。 事件处理器由程序员编写,程序员通过事件处理器中方法的参数(比较重要的方法-startElement,endElement,characters),就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。(需要用到时再具体了解)

=================================================>

  Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽 象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。 Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了 Dom4j。 使用Dom4j开发,需下载dom4j相应的jar文件。(需要用到时再具体了解)

时间: 2024-10-06 16:34:58

JAXP进行DOM解析的实践的相关文章

xml解析-jaxp之dom解析

package day06_parser.dom; /** * xml的解析技术:JAXP是Java API for XML Processing的英文字头缩写, * 中文含义是:用于XML文档处理的使用Java语言编写的编程接口.JAXP支持DOM.SAX.XSLT等标准. * 下面我们研究两种解析方式: * 1.dom解析 2.sax解析:Simple API for XML * 下面是dom解析的实例. * JAXP-DOM解析实例: * 下面的实例实现的功能是,通过javax.xml包实

Java学习之道:使用JAXP进行DOM解析( DocumentBuilderFactory、DocumentBuilder、Document)

1.javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回 2.调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂. 3.调用工厂对象的 newDocumentBuilder

XML系列:(4)XML解析-JAXP的DOM解析方式读取XML

DOM.SAX和StAX只是解析方式,没有API. JAXP是SUN提供的一套XML解析API.    JAXP(Java API for XMLProcessing,意为XML处理的Java API) JAXP很好的支持DOM和SAX解析. JAXP开发包是JAVASE的一部分,它由java.xml.org.w3c.dom.org.xml.sax包及其子包组成 products.mxl <?xml version="1.0" encoding="UTF-8"

XML系列:(5)XML解析-JAXP的DOM解析方式修改XML

DOM.SAX和StAX只是解析方式,没有API. JAXP是SUN提供的一套XML解析API.JAXP(Java API for XMLProcessing,意为XML处理的Java API) JAXP很好的支持DOM和SAX解析. JAXP开发包是JAVASE的一部分,它由java.xml.org.w3c.dom.org.xml.sax包及其子包组成 1.以DOM解析方式修改XML 1.1.将Document树保存到文件中 package com.rk.xml.e_jaxp_dom_writ

使用jaxp对比xml进行DOM解析

/*DOM解析编程 •遍历所有节点 •查找某一个节点 •删除结点 •更新结点 •添加节点 /* package cn.itcast.jaxp; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigu

jaxp解析XML之DOM解析

XML解析技术XML解析方式分为三种一种是DOM解析一种是SAX解析 DOM思想:将整个xml加载入内存,形成围挡对象,所有对xml操作都是对内存中节点对象进行,DOM是官方xml解析标准,同时支持解析其他各种语言 SAX解析方式的出现,因为DOM的解析方式需要对文档进行加载入内存,当文档较大的时候比较消耗资源,这时候就出现了SAX解析SAX思想:一边解析,一边处理,一边释放资源 在JDK6中又引入了另一种StAX解析方式是一种拉模式的xml解析方式,而SAX是一种推模式XML解析方式推模式由服

使用JAXP对XML文档进行DOM解析

一.XML解析方式分为两种:dom和sax dom:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式. sax:(Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它. dom和sax解析方法的区别: dom:对文档CRUD(增删改查)比较方便,缺点:占用内存比较大(将xml文件全部读入内存). sax:占用内存较少,解析速度快(从上往下读一行解析一行).缺点:只适合读取,不适合CRU

使用JAXP进行XM解析(基于DOM)

最近在做微信开发需要各种解析各种xml,基本用JAXP 解析的 JAXP 开发包是J2SE的一部分,它由javax.xml.org.w3c.dom .org.xml.sax 包及其子包组成. 在 javax.xml.parsers 包中,定义了几个工厂类,通过调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象. javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFa

利用jaxp对xml进行dom解析

1 <?xml version="1.0" encoding="UTF-8"?> 2 <书架> 3 <书> 4 <书名>何茂赟自传</书名> 5 <作者>何茂赟</作者> 6 <售价>100.00元</售价> 7 </书> 8 <书> 9 <书名>何茂赟自传2</书名> 10 <作者>何茂赟</