zoukankan      html  css  js  c++  java
  • Java——DOM方式生成XML (转)

    http://blog.csdn.net/u012325167/article/details/50943202

    使用DOM方式生成XML文件有如下几步:

    首先是创建DOM树(即规定XML文件中的内容):

    • 创建DocumentBuilderFactory对象
    • 通过DocumentBuilderFactory对象创建DocumentBuilder对象
    • 通过DocumentBuilder对象的newDocument()方法创建一个Document对象,该对象代表一个XML文件
    • 通过Document对象的createElement()方法创建根节点
    • 通过Document对象的createElement()方法创建N个子节点,并为他们赋值,再将这些子节点添加到根节点下
    • 将根节点添加到Document对象下

    其次是将DOM树转换为XML文件:

    • 创建TransformerFactory类的对象
    • 通过TransformerFactory创建Transformer对象
    • 使用Transformer对象的transform()方法将DOM树转换为XML文件。(该方法有两个参数,第一个参数为源数据,需要创建DOMSource对象并将Document加载到其中;第二个参数为目的文件,即要生成的XML文件,需要创建StreamResult对象并指定目的文件)

    下面开始实现:

    首先是创建DOM树的部分:

    创建DocumentBuilderFactory类的对象:

    // 创建DocumentBuilderFactory
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    • 1
    • 2
    • 1
    • 2

    创建DocumentBuilder对象:

    // 创建DocumentBuilder
    DocumentBuilder builder = factory.newDocumentBuilder();
    • 1
    • 2
    • 1
    • 2

    创建Document:

    // 创建Document
    Document document = builder.newDocument();
    • 1
    • 2
    • 1
    • 2

    创建根节点:

    // 创建根节点
    Element bookstore = document.createElement("bookstore");
    • 1
    • 2
    • 1
    • 2

    创建子节点并添加属性:
    通过Document的createElement()方法可创建节点,通过Element的setAttribute()方法可设置属性。

    // 创建子节点,并设置属性
    Element book = document.createElement("book");
    book.setAttribute("id", "1");
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    为book节点添加子节点:
    通过Element的setTextContent()方法可设置节点之间的内容(节点的值),通过Element的appendChild()方法可为节点添加子节点。

    // 为book添加子节点
    Element name = document.createElement("name");
    name.setTextContent("安徒生童话");
    book.appendChild(name);
    Element author = document.createElement("author");
    author.setTextContent("安徒生");
    book.appendChild(author);
    Element price = document.createElement("price");
    price.setTextContent("49");
    book.appendChild(price);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    为根节点添加子节点:

    // 为根节点添加子节点
    bookstore.appendChild(book);
    • 1
    • 2
    • 1
    • 2

    将根节点添加到Document下:

    // 将根节点添加到Document下
    document.appendChild(bookstore);
    • 1
    • 2
    • 1
    • 2

    至此,DOM树就生成完了。


    下面开始生成XML文件:

    创建TransformerFactory对象:

    // 创建TransformerFactory对象
    TransformerFactory tff = TransformerFactory.newInstance();
    • 1
    • 2
    • 1
    • 2

    创建Transformer对象:

    // 创建Transformer对象
    Transformer tf = tff.newTransformer();
    • 1
    • 2
    • 1
    • 2

    使用Transformer对象的transform()方法将DOM树转换成XML:

    // 使用Transformer的transform()方法将DOM树转换成XML
    tf.transform(new DOMSource(document), new StreamResult(dest));
    • 1
    • 2
    • 1
    • 2

    至此,就完成了对XML文件的生成。


    运行结果如下:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?><bookstore><book id="1"><name>安徒生童话</name><author>安徒生</author><price>49</price></book></bookstore>
    • 1
    • 1

    可见XML文件生成成功了。但是,文件中的内容是一整行的,没有换行,不易读。
    这时,我们需要使用Transformer的setOutputProperty()方法设置输出属性,设置为换行即可。

    // 设置输出数据时换行
    tf.setOutputProperty(OutputKeys.INDENT, "yes");
    • 1
    • 2
    • 1
    • 2

    再次运行,可见XML文件中内容已正确换行:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <bookstore>
    <book id="1">
    <name>安徒生童话</name>
    <author>安徒生</author>
    <price>49</price>
    </book>
    </bookstore>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    此外,可以看到,在XML文件的声明部分中,有standalone属性,该属性表示当前XML是否有相对应的dtd或schema文件作为其说明文档。

    若属性值为“yes”,则代表当前XML文件没有dtd和schema文件作为其说明文档。

    由于我们这里没有用到dtd和schema,所以我们可以通过Document的setXmlStandalone()方法将该属性隐藏掉。

    // 设置XML声明中standalone为yes,即没有dtd和schema作为该XML的说明文档,且不显示该属性
    document.setXmlStandalone(true);
    • 1
    • 2
    • 1
    • 2

    再次测试,可发现该已经没有该属性了。


    下面给出完整的代码:

    package util;
    
    import java.io.File;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    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;
    
    public class FileUtil {
    
        public void createXMLByDOM(File dest) {
            // 创建DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            try {
    
                // 创建DocumentBuilder
                DocumentBuilder builder = factory.newDocumentBuilder();
    
                // 创建Document
                Document document = builder.newDocument();
    
                // 设置XML声明中standalone为yes,即没有dtd和schema作为该XML的说明文档,且不显示该属性
                // document.setXmlStandalone(true);
    
                // 创建根节点
                Element bookstore = document.createElement("bookstore");
    
                // 创建子节点,并设置属性
                Element book = document.createElement("book");
                book.setAttribute("id", "1");
    
                // 为book添加子节点
                Element name = document.createElement("name");
                name.setTextContent("安徒生童话");
                book.appendChild(name);
                Element author = document.createElement("author");
                author.setTextContent("安徒生");
                book.appendChild(author);
                Element price = document.createElement("price");
                price.setTextContent("49");
                book.appendChild(price);
    
                // 为根节点添加子节点
                bookstore.appendChild(book);
    
                // 将根节点添加到Document下
                document.appendChild(bookstore);
    
                /*
                 * 下面开始实现: 生成XML文件
                 */
    
                // 创建TransformerFactory对象
                TransformerFactory tff = TransformerFactory.newInstance();
    
                // 创建Transformer对象
                Transformer tf = tff.newTransformer();
    
                // 设置输出数据时换行
                tf.setOutputProperty(OutputKeys.INDENT, "yes");
    
                // 使用Transformer的transform()方法将DOM树转换成XML
                tf.transform(new DOMSource(document), new StreamResult(dest));
    
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (TransformerConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (TransformerException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
  • 相关阅读:
    [文摘20070723]最经典的爱情观
    [转]ASP .Net C# 下 Word开发资料
    [引]如何藉由使用 Visual C# . NET 處理 Word 中的事件
    简单的搭建Web系统常用的框架页面
    Gentle 简单配置方法之一种
    在 可编辑的 Div 的 光标位置 插入 文字 或 HTML
    [转]使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
    VS2005 添加 Microsoft.Office.Tools.Word.dll 等引用
    要事第一 事不过三
    VC slider用法
  • 原文地址:https://www.cnblogs.com/quietwalk/p/6633709.html
Copyright © 2011-2022 走看看