xml-03-Java操作XML

来源:互联网 发布:威少刷数据视频 编辑:程序博客网 时间:2024/05/17 01:40
一、递归遍历整个文档

1.创建Document对象

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 创建文档构建器工厂
DocumentBuilder builder = factory.newDocumentBuilder(); // 通过工厂来获得文档构建器
Document doc = builder.parse(new File("example.xml")); //读取xml文件生成一个document对象

2.递归打印节点名称

public static void printNodeName(Node node,String line){
if(node instanceof Element){
     System.out.println(line + node.getNodeName());
}
if(node.hasChildNodes()){
         NodeList nl = node.getChildNodes();
         for(int i =0;i<nl.getLength();i++){
             printNodeName(nl.item(i),line+"\t");
         }
     }
}

3.完整事例

package xml;


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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXml {

    public static void main(String[] args) throws Exception {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(ReadXml.class.getClassLoader().getResourceAsStream("config.xml"));
        Node nodeList = document.getFirstChild();
        printNodeName(nodeList,"");
    }


    public static void printNodeName(Node node,String line){
        if(node instanceof Element){
            System.out.println(line + node.getNodeName());
        }
        if(node.hasChildNodes()){
            NodeList nl = node.getChildNodes();
            for(int i =0;i<nl.getLength();i++){
                printNodeName(nl.item(i),line+"\t");
            }
        }
    }

}


二、写Document到文档

1.创建Document对象

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument(); // 创建一个新的对象

2.创建Dom节点

Element rootEle = doc.createElement("books"); // 创建一个节点
doc.appendChild(rootEle); // 挂到document上,也就是根节点
Element e = doc.createElement("book"); // 再创建一个节点
e.setAttribute("name", "疯狂java讲义"); // 给节点设置属性
rootEle.appendChild(e); // 把节点添加到创建的节点下

3.把Document写入到文件中

TransformerFactory tf = TransformerFactory.newInstance();
Transformer ts = tf.newTransformer();
DOMSource ds = new DOMSource(doc); // 要写出的资源
PrintWriter pw = new PrintWriter(new File("c.xml")); // 写出的目的地
StreamResult sr = new StreamResult(pw); // 使用result包裹流
ts.transform(ds, sr);

4.例子(Example)

package xml;

import java.io.File;
import java.io.PrintWriter;

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.Element;

public class Writer {

    public static void main(String[] args) throws Exception {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        Document doc = builder.newDocument(); // 创建一个新的对象
                //parse(Writer.class.getClassLoader().getResourceAsStream("config.xml"));

        Element rootEle = doc.createElement("books");
        doc.appendChild(rootEle);
        Element e = doc.createElement("book");
        e.setAttribute("name", "疯狂java讲义");
        rootEle.appendChild(e);


        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer ts = tf.newTransformer();
        DOMSource ds = new DOMSource(doc); // 要写出的资源
        PrintWriter pw = new PrintWriter(new File("c.xml")); // 写出的目的地
        StreamResult sr = new StreamResult(pw); // 使用result包裹流
        ts.transform(ds, sr);

    }

}

三、读写Document

1.创建Document对象

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(
          ReadXml.class.getClassLoader().getResourceAsStream("config.xml")); // 加载classpath下的xml文件生成dom树

2.对读取的Document对象进行修改

Element e = doc.getDocumentElement(); // 获得根节点
Element book = doc.createElement("book"); // 创建一个新节点
book.setAttribute("name", "疯狂HTML讲义"); // 给新的节点设置属性
e.appendChild(book); // 把新创建的节点添加到根节点下
System.out.println(e.getNodeName()); // 打印根节点的名字

3.将修改后的Document对象写入到文件

TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();

DOMSource xmlSource = new DOMSource(doc);
StreamResult sr = new StreamResult(new PrintWriter("d.xml"));
t.transform(xmlSource, sr);

4.完整事例

package xml;


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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXml {

    public static void main(String[] args) throws Exception {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(ReadXml.class.getClassLoader().getResourceAsStream("config.xml"));
        Node nodeList = document.getFirstChild();
        printNodeName(nodeList,"");
    }


    public static void printNodeName(Node node,String line){
        if(node instanceof Element){
            System.out.println(line + node.getNodeName());
        }
        if(node.hasChildNodes()){
            NodeList nl = node.getChildNodes();
            for(int i =0;i<nl.getLength();i++){
                printNodeName(nl.item(i),line+"\t");
            }
        }
    }

}

四、抽取公共方法
我们发现,每个读方法中都要进行读取文件解析为dom对象,每个写方法都要把node对象写入到一个文件中进行持久化,既然是常用的方法,那么我们就要对其进行抽取。代码如下:
package cn.anbow.utils;import java.io.File;import java.io.PrintWriter;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;public class DomUtils {/** * 读取xml文件转成dom对象 * @param fileName * @return */public static Document readXml(String fileName){try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc= builder.parse(new File(fileName));return doc;} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}/** * 把dom对象写入到文件中 * @param node * @param filePath */public static void writeXml(Node node,String filePath){TransformerFactory factory = TransformerFactory.newInstance();Transformer tf;try {tf = factory.newTransformer();DOMSource ds = new DOMSource(node);StreamResult sr = new StreamResult(new PrintWriter(filePath));tf.transform(ds, sr);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


这样,我们使用java对xml的操作就完成了。











0 0
原创粉丝点击