`
步行者
  • 浏览: 169819 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

    博客分类:
  • 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>

 

 

 

分享到:
评论
4 楼 wave-labs 2009-11-18  
dom4j的实现方式:
    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setIndent("\t");
    format.setEncoding("UTF-8");
    Document document = DocumentHelper.createDocument();
    document.addElement("");
    ……
3 楼 步行者 2009-11-16  
<p>回复楼上:<br>因为默认的缩进为0,<br>加这一行<br><strong><span style="color: #ff0000;">transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");</span></strong><br>就可以了<br>具体细节 可以看看这篇位置<br>http://hi.baidu.com/tomcat8080/blog/item/a7d2f236223ce8340b55a94c.html</p>
2 楼 piper 2009-11-15  
版主,你的文章不错,正在一一拜读中,有个小问题,
transformer.setOutputProperty("indent","yes");
为什么不能缩进,急切盼望答复,谢谢
1 楼 d_eye 2009-10-15  
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
好像对输也没有影响(jdk1.6)

相关推荐

    dom4j解析xml详解

    ### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...

    java_Dom4j解析XML详解

    XML解析主要分为DOM、SAX和StAX三种方式。DOM4J基于DOM模型,但性能优于标准DOM,因为它使用了优化的树结构。DOM将整个XML文档加载到内存中,形成一个完整的树形结构;SAX是事件驱动的,逐行解析,不保存整个文档;...

    dom4j解析xml详解,包含源代码,dom4j.jar包

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而灵活的API,使得在Java应用程序中读取、写入、修改以及查询...提供的源代码和解析XML详解文档将有助于进一步理解DOM4J的工作机制,并提升实际开发能力。

    Android创建与解析XML(二)——详解Dom方式

    DOM方式解析XML是一种内存密集型的操作方式,因为它需要将整个文档加载到内存中并构建出DOM树。对于小到中等规模的文档,DOM是一个很好的选择,但如果处理大型的XML文件,则可能会因为内存消耗过大而导致性能问题。...

    dom4j---xml解析jar包

    **DOM4J——XML解析库详解** XML(eXtensible Markup Language)作为一种标记语言,广泛应用于数据交换、配置文件和文档存储等领域。在Java环境中,解析XML文档时,我们通常会遇到各种库,其中DOM4J是一个非常流行...

    java中用dom解析xml的经典入门级文档

    ### Java中使用DOM解析XML详解 #### 一、引言 在Java开发中,解析XML是一种常见的需求。XML(Extensible Markup Language,可扩展标记语言)作为一种数据存储和传输的标准格式,在不同系统间的数据交换中扮演着...

    dom4j解析xml

    ### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J是一个Java库,用于处理XML文档。它的设计目标是为了提供一个简单、易于使用的API来处理XML文件,同时保持性能上的优势。与Java标准库中的DOM实现相比,DOM4J...

    XML解析技术DOM4J解析

    DOM4J提供了对XML Schema的全面支持,允许开发者在解析XML文档时进行严格的模式验证,确保数据的准确性和一致性。这对于企业级应用尤为重要,因为它们往往需要处理大量的结构化数据。 **3. 基于事件的处理** 对于...

    java_Dom4j解析XML详解.doc

    ### DOM4J解析XML详解 #### 一、DOM4J简介 DOM4J是一个由dom4j.org组织提供的开源XML解析工具包,专为Java平台设计。它支持DOM(Document Object Model)、SAX(Simple API for XML)以及JAXP(Java API for XML ...

    dom4j解析xml实例

    DOM4J是一个非常流行的、强大的Java XML API,它提供了灵活且高效的方式来解析、创建、修改XML文档。本文将深入探讨如何使用DOM4J进行XML解析,并通过实例来帮助理解。 首先,让我们了解DOM4J的基本概念。DOM4J是...

    Dom4j遍历解析XML

    Dom4j(Document Object Model for Java)是一个Java语言的开源XML API,它提供了非常便捷的方式来解析、创建以及操作XML文档。相较于其他XML解析库如SAX、JDOM等,Dom4j具有更强大的功能与更好的性能。 为了使用...

    JAVA DOM解析XML文件过程详解

    JAVA DOM 解析 XML 文件过程详解 JAVA DOM 解析 XML 文件过程详解是指使用 JAVA 语言通过 DOM(Document Object Model)解析 XML 文件的过程。DOM 是一种应用程序接口(API),它将 XML 文档转换为一个树形结构,...

    Dom4j例子,可以解析大部分的XML

    **Dom4j详解:解析XML的强大工具** Dom4j是一个开放源码的Java库,它提供了灵活且功能强大的API来处理XML文档。在Java世界中,XML作为一种数据交换格式广泛应用于各种应用程序,如配置文件、数据传输、文档存储等。...

    dom动态生成使用XML DOM生成XML.pdf

    ### DOM动态生成与XML DOM的使用 ...本文介绍了XML DOM的基本概念、主要对象以及如何使用XMLDOMDocument对象创建XML文档的方法。掌握了这些知识,你就可以更轻松地在各种应用场景中使用XML技术了。

    java解析xml——dom

    ### Java解析XML——DOM详解 #### 一、DOM解析概念 **Document Object Model (DOM)**是一种平台和语言中立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。DOM最初是为HTML设计的,但后来也被...

    dom4j创建与解析xml分析与实例

    ### DOM4J创建与解析XML文档详解 #### 一、DOM4J简介 DOM4J是一种基于Java的轻量级XML处理库,它提供了一种简单直观的方式来读取、写入和修改XML文档。DOM4J是开源的,并且遵循Apache 2.0许可协议。与Java自带的...

    dom4j.jar包,java解析xml dom4j.jar包

    - **内存效率**:与DOM相比,DOM4J占用更少的内存,因为它不是完整的文档树,而是基于事件驱动的解析方式。 - **全面的XPath支持**:DOM4J支持XPath,允许通过简单的表达式快速定位XML文档中的元素和属性。 - **XML ...

    dom4j解析xml.txt

    ### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款用于处理XML文档的轻量级Java库。它提供了一种非常简单且灵活的方式来创建、读取、修改和删除XML文档。DOM4J的主要...

    java_Dom4j解析XML详解.docx

    Java中的DOM4J库是一个强大的XML处理工具,它提供了对XML文档的全面支持,包括解析、操作和生成XML。DOM4J的设计遵循了Java集合框架,并且与DOM、SAX和JAXP等XML处理API兼容,使得它在灵活性和易用性上表现优秀。 ...

    java_Dom4j解析XML详解.pdf

    - **读取XML文档**:DOM4J提供`SAXReader`和`DOMReader`两种方式。通常,`SAXReader`更适合处理大型XML文件,因为它基于事件驱动,不需要一次性加载整个文档到内存。以下是一个使用`SAXReader`读取XML文件的例子: ...

Global site tag (gtag.js) - Google Analytics