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

    以 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>

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值