DOM解析

一、DOM解析特点:

  (1)在加载的时候,一次性的把整个XML文档加载进内存,在内存中形成一颗树(Document对象);

  (2)使用代码操作Document,其实操作的是内存中的DOM树,和本地磁盘中的XML文件没有直接关系;

  (3)由于操作的是内存当中的dom,磁盘中xml当中的内容并没有变,要进行同步,让两边保持一致;

  (4)缺点:若XML文件过大,可能造成内存溢出;

二、DOM解析使用的类和接口:

  1、DocumentBuilderFactory类:位于java.lang.Object包;

    //使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器。

    (1)获取实例对象:static DocumentBuilderFactory newInstance() ;

      //获取DocumentBuilderFactory工厂;

    (2)方法:abstract  DocumentBuilder newDocumentBuilder()  

      //获取DocumentBuilder的实例对象;

  2、DocumentBuilder类

    方法:Document parse(File f);解析指定XML文件,返回一个 DOM Document 对象。

  3、Document接口:

    方法:

    (1NodeList getElementsByTagName(String tagname);返回指定标签名的NodeLIst集合;

    (2NodeList getChildNodes();返回所有的子节点集合;

  4、NodeList接口:

    方法:

    (1int getLength();返回节点个数;

    (2Node item(int index);返回指定索引的Node接口;

  5、Node接口:

    查询:

    (1String getTextContent();返回节点及后代的文本;

    (2String getNodeName();返回节点名;

    (3String getNodeValue();返回节点值;

    (4)short getNodeType();返回节点类型的数值;

    (5NamedNodeMap getAttributes();返回当前元素节点的所有属性节点集合;

    修改:

    (1)void setTextContent(String textContent);把指定的node对象的值修改为textContent;

  6、Element接口:

    //Node的父接口;

    (1void setTextContent(String textContent);

      //设置新创建的解点内容;

    (2Node appendChild(Node newChild);返回值为添加的节点;

      //把新的解点添加到指定节点的末尾;

  7TransformerFactory:位于java.lang.Object包;

    //传输器,用于同步XML代码;

    (1)获取实例对象:static TransformerFactory newInstance();

    (2)方法:abstract  Transformer newTransformer();

  8、Transformer

    方法:abstract  void transform(Source xmlSource, Result outputTarget);

      //用流同步本地xml文件;

      //参数:1)source传入DOMSource的实例对象;2)传入:StreamResult的实例对象;

三、DOM解析查询元素:

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book>
        <number>001</number>
        <name>论语</name>
        <author>孔子</author>
    </book>

    <book>
        <number>002</number>
        <name>西游记</name>
        <author>吴承恩</author>
    </book>

    <book>
        <number>003</number>
        <name>时间简史</name>
        <author>霍金</author>
    </book>
</books>
public class Test {
    public static void main(String[] args) throws Exception {
        // 1、创建解析器工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2、通过解析器工厂得到解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3、通过解析器得到document对象
        Document doc = db.parse("E:\\JavaProject\\review\\src\\dom\\Book.xml");
        // 4、根据根节点名称获取节点内容
        NodeList nodeList = doc.getElementsByTagName("book");
        System.out.println(nodeList.getLength());
        // 5、返回节点文本
        Node item = nodeList.item(0);
        System.out.println(item.getTextContent());
    }
}

三、DOM解析修改元素:

public class Test {
    public static void main(String[] args) throws Exception {
        // 1、创建解析器工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2、通过解析器工厂得到解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3、通过解析器得到document对象
        Document doc = db.parse("E:\\JavaProject\\review\\src\\dom\\Book.xml");
        // 4、根据根节点名称获取节点内容
        NodeList nodelist = doc.getElementsByTagName("name");
        Node node = nodelist.item(0);
        // 5、修改值
        node.setTextContent("修改后的书名");
        // 6、创建传输器
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        // 7、同步本地xml;
        tf.transform(new DOMSource(doc), new StreamResult("E:\\JavaProject\\review\\src\\dom\\Book.xml"));
    }
}

三、DOM解析添加元素:

public class Test {
    public static void main(String[] args) throws Exception {
        // 1、创建解析器工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2、通过解析器工厂得到解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3、通过解析器得到document对象
        Document doc = db.parse("E:\\JavaProject\\review\\src\\dom\\Book.xml");
        // 4、根据根节点名称获取节点内容
        NodeList nodelist = doc.getElementsByTagName("books");
        Node node = nodelist.item(0);
        //5、创建一个节点
        Element book = doc.createElement("book");
        book.setTextContent("新书");
        // 6、新节点插入
        node.appendChild(book);
        // 7、同步本地xml
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.transform(new DOMSource(doc), new StreamResult("E:\\JavaProject\\review\\src\\dom\\Book.xml"));
    }
}

三、DOM解析删除元素:

public class Test {
    public static void main(String[] args) throws Exception {
        // 1、创建解析器工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2、通过解析器工厂得到解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3、通过解析器得到document对象
        Document doc = db.parse("E:\\JavaProject\\review\\src\\dom\\Book.xml");
        // 4、根据根节点名称获取节点内容
        NodeList nodelist = doc.getElementsByTagName("book");
        Node node = nodelist.item(0);
        // 5、获得指定node节点的父节点
        Node parentNode = node.getParentNode();
        // 6、通过父节点删除指定节点
        parentNode.removeChild(node);
        // 7、同步本地xml
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.transform(new DOMSource(doc), new StreamResult("E:\\JavaProject\\review\\src\\dom\\Book.xml"));
    }
}

 

 

 

posted @ 2019-08-04 22:10  开拖拉机的拉风少年  阅读(612)  评论(0编辑  收藏  举报