论坛首页 Java企业应用论坛

DOM 与 DOM 解析详解(三)以 DOM 方式创建xml文档

浏览 8948 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-06-02   最后修改:2009-11-16
OO

    以 DOM 方式创建XML文档,示例如下(标有详细注释)

     注意下面的toXMLString 方法,如何将Document转化为XML字符串。

 

package Test_DOM;

import java.io.ByteArrayOutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.Attr;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Test {

	public static void main(String[] args) 
			throws ParserConfigurationException, TransformerException {
		DocumentBuilderFactory builderFactory = 
			DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		
		//创建一个DOM文档
		Document document = builder.newDocument();
		//创建一个DOM带有命名空间的元素
		Element books = document.createElementNS("http://test.org/books","books");
		//为文档document添加子节点books
		document.appendChild(books);
		//创建一个命名空间属性
		Attr ns = document.createAttributeNS("http://test.org", "count");
		ns.setValue("1");
		//创建一个注释节点
		Comment comment = document.createComment("books's comment");
		//创建一个元素节点
		Element book = document.createElement("book");
		//为元素节点books设置命名空间ns
		books.setAttributeNodeNS(ns);
		//为元素节点books添加子节点comment
		books.appendChild(comment);
		//为元素节点books添加子节点book
		books.appendChild(book);
		/*
		 * 为元素节点book添加属性,等价于:
		 *   Attr bookId = document.createAttribute("id");
		 *   bookId.setValue("1");
		 *   book.setAttributeNode(bookId);
		 */
		book.setAttribute("id", "1");
		//创建一个元素节点
		Element bookname = document.createElement("name");
		//为元素节点book添加子节点bookname
		book.appendChild(bookname);
		//创建一个文本节点,并添加到元素bookname中
		bookname.appendChild(document.createTextNode("Thinking in JAVA"));
		
		//打印document节点
		printNode(document,0); 
		//将document节点输出为XML格式
		System.out.println(toXMLString(document));
	}
	
	
	/*
	 * 打印 DOM 节点
	 * 输出格式为:
	 *     [nodeName,nodeValue]
	 *     	   attributeName=attributeValue
	 *         ...
	 *         [childNodeName,childNodeValue]
	 *         ...
	 */
	public static void printNode(Node node,int count){
		if(node != null){
			String tmp = "";
			for(int i = 0 ; i < count ; i++)
				tmp += "  ";
			System.out.println(tmp+node);
			/*
			 * node.getAttributes()方法返回
			 * 包含node节点的属性的 NamedNodeMap(如果它是 Element)
			 */
			NamedNodeMap attrs = node.getAttributes();
			if(attrs != null)
				for(int i = 0 ; i < attrs.getLength() ; i++){
					printNode(attrs.item(i),count+1);
				}
			/*
			 * node.getChildNodes()方法返回
			 * 包含node节点的所有子节点的 NodeList。
			 */
			NodeList childNodes = node.getChildNodes();
			for(int i = 0 ; i < childNodes.getLength() ; i++){
				printNode(childNodes.item(i),count+1);
			}
		}
	}
	
	//返回文档Document的XML格式的字符串
	public static String toXMLString(Document document) 
			throws TransformerException{
		/*
		 * 创建一个DOM转换器
		 */
		TransformerFactory  transformerFactory  =  TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		/*
		 * 设置输出属性 
		 *     encoding = "GB2312" 代表 输出的编码格式为 GB2312
		 *     indent = "yes" 代表缩进输出
		 */
		transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312");
		transformer.setOutputProperty(OutputKeys.INDENT,"yes");
		transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
		ByteArrayOutputStream  outputStream  =  new  ByteArrayOutputStream();
		//transformer.transform()方法 将 XML Source转换为 Result
		transformer.transform(new DOMSource(document), new StreamResult(outputStream));
		return outputStream.toString(); 
	}

}
 

运行结果如下:

 

[#document: null]
  [books: null]
    count="1"
      [#text: 1]
    [#comment: books's comment]
    [book: null]
      id="1"
        [#text: 1]
      [name: null]
        [#text: Thinking in JAVA]
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<books xmlns:ns0="http://test.org" ns0:count="1" xmlns="http://test.org/books">
<!--books's comment-->
<book id="1">
<name>Thinking in JAVA</name>
</book>
</books>

 

 

 

   发表时间:2009-10-15  
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
好像对输也没有影响(jdk1.6)
0 请登录后投票
   发表时间:2009-11-16   最后修改:2009-11-19

回复楼上:
因为默认的缩进为0,
加这一行
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
就可以了
具体细节 可以看看这篇位置
http://hi.baidu.com/tomcat8080/blog/item/a7d2f236223ce8340b55a94c.html

0 请登录后投票
   发表时间:2009-11-18  
dom4j的实现方式:
    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setIndent("\t");
    format.setEncoding("UTF-8");
    Document document = DocumentHelper.createDocument();
    document.addElement("");
    ……
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics