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