Java:XML篇,使用DOM读取并解析XML

1. 描述

  1. DOM(Document Object Model) DOM 一种独立于平台和语言的方式访问和修改一个文档的内容和结构。 
  2. DOM 采用建立树形结构的方式访问 XML文档,实际上是以面向对象方式描述的文档模型。 
  3. DOM 树在内存中是持久的,程序能对数据和结构作出更改,使用起来也要简单得多。 
  4. DOM 对于特别大的文档,解析和加载整个文档可能很慢且很耗资源。

2. 示范代码

package com.clzhang.sample.xml;

import java.io.*;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
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.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;

/**
 * DOM(Document Object Model) DOM 一种独立于平台和语言的方式访问和修改一个文档的内容和结构。 
 * DOM 采用建立树形结构的方式访问 XML文档,实际上是以面向对象方式描述的文档模型。 
 * DOM 树在内存中是持久的,程序能对数据和结构作出更改,使用起来也要简单得多。 
 * DOM 对于特别大的文档,解析和加载整个文档可能很慢且很耗资源。
 */
public class DOMTest {
    // 读取文件测试(其输入是writeXMLFile的输出)
    public void parseByDOM(String filename) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        Document doc = builder.parse(new File(filename));
        NodeList nlDoc = doc.getElementsByTagName("doc");
        for (int i = 0; i < nlDoc.getLength(); i++) {
            Element element = (Element)nlDoc.item(i);
            System.out.println(element.getNodeName() + "\tid=" + element.getAttribute("id"));
            for (Node node = element.getFirstChild(); node != null; node = node
                    .getNextSibling()) {
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element child = (Element) node;
                    String value = child.getTextContent();
                    System.out.println("\t" + child.getNodeName() + "=" + value);
                }
            }
            System.out.println();
        }
    }
    
    // 写入文件测试
    public void writeXMLFile(String filename) throws Exception {
        // 创建对象结构
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = dbf.newDocumentBuilder();
        Document doc = builder.newDocument();
        
        // 先创建根节点
        Element root = doc.createElement("add");
        doc.appendChild(root); // 将根元素添加到文档上
        
        // 再创建子节点一,并加入些信息
        Element element = doc.createElement("doc");
        element.setAttribute("id", "1");
        Element title = doc.createElement("title");
        title.appendChild(doc.createTextNode("维护权益!")); 
        element.appendChild(title);
        Element content = doc.createElement("content");
        content.appendChild(doc.createTextNode("有一个更完善的交流平台,共建美好家园"));
        element.appendChild(content);
        root.appendChild(element);
        
        // 再创建子节点二,并加入些信息
        element = doc.createElement("doc");
        element.setAttribute("id", "2");
        title = doc.createElement("title");
        title.appendChild(doc.createTextNode("不维护权益!")); 
        element.appendChild(title);
        content = doc.createElement("content");
        content.appendChild(doc.createTextNode("没有一个更完善的交流平台,不共建美好家园"));
        element.appendChild(content);
        root.appendChild(element);
        
        // 输出到文件
        Source source = new DOMSource(doc);
        FileOutputStream fos = new FileOutputStream(filename);
        OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        tf.transform(source, new StreamResult(osw));
        osw.close();
        fos.close();
    }

    public static void main(String arge[]) throws Exception {
        long starttime = System.currentTimeMillis();
        
        DOMTest ins = new DOMTest();
        ins.writeXMLFile("bbs.xml");
        ins.parseByDOM("bbs.xml");

        System.out.println("运行时间:" + (System.currentTimeMillis() - starttime)
                + " 毫秒");
    }
}
原文地址:https://www.cnblogs.com/nayitian/p/2867238.html