DOM创建XML

@author ixenos

1、思路:


先封装构建一颗DOM树,然后将DOM树转换成XML文件

2、三种写DOM树到XML文件的方式


1)使用DOM(或DOM4J、JDOM)

2)使用LSSerializer接口

3)使用XSLT(Extensible  StyleSheet Language Transformations)可扩展的格式页转换,XSL转换

3、构建一颗DOM树


1)不带名称空间

DocumentBuilderFactory  factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.newDocument();

//创建标签节点

Element rootElement = doc.createElement(rootName);

Element childElement = doc.createElement(childName);

//创建文本节点

Text textNode = doc.createTextNode(textContents);

//给文档添加根元素,给父节点添加子节点

doc.appendChild(rootElement);

rootElement.appendChild(childElement);

childElement.appendChild(textNode); //添加文本节点

//设置元素属性

rootElement.setAttribute(name, value);

2)带名称空间

DocumentBuilderFactory  factory = DocumentBuilderFactory.newInstance();

factory.setNamespaceAware(true);

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.newDocument();

//然后使用createElementNS而不是createElement来创建节点

String namespace = http://www.w3c.org/2000/svg;

Element rootElement = doc.createElementNS(namespace, “svg”); //svg标签名

//如果节点具有命名空间前缀,则xmlns前缀属性会被自动创建

Element svgElement = doc.createElementNS(namespace, “svg:svg”); //svg前缀

当该元素被写入XML文件时,它会转变为:

<svg:svg  xmlns:svg=”http://www.w3c.org/2000/svg”>

//元素属性有名称空间

rootElement.setAttributeNS(namespace, qualifiedName, value);

//DOM4J

//1.创建document对象,代表整个xml文档

Document document = DocumentHelper.createDocument();

//2.创建根节点rss

Element rss = document.addElement("rss");

//3.向rss节点中添加version属性

rss.addAttribute("version", "2.0");

//4.生成子节点及节点内容

Element channel = rss.addElement("channel");

Element title = channel.addElement("title");

title.setText("<![CDATA[上海移动互联网产业促进中心正式揭牌 ]]>");

4、写出树的内容到XML


1)DOM原生

//不对DOM树做任何修改的转换器

Transformer t =TransformerFactory.newInstance().newTransformer();

//为了将DOCTYPE节点纳入输出,还需将SYSTEM和PUBLIC标识符设置为输出属性

t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, systemIdentifier);

t.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,publicIdentifier);

//设置缩进规则

t.setOutputProperty(OutputKeys.INDENT, “yes”);

t.setOutputProperty(OutputKeys.METHOD, “xml”);

t.setOutputProperty(“{http://xml.apache.org/xslt}indent-amount”,  “2”);

//应用不做任何修改的转换操作,开始转换

t.transform(new DOMSource(doc),new StreamResult(new FileOutputStream(file)));

//DOM4J

OutputFormat format = OutputFormat.createPrettyPrint();

format.setEncoding("GBK");

// 生成xml文件

File file = new File("rssnews.xml");

XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);

//设置是否转义,默认值是true,代表转义

writer.setEscapeText(false);

writer.write(document);

writer.close();

2)使用LSSerializer接口

//获取LSSerializer

DOMImplementation impl = doc.getImplementation();

DOMImplementationLS implLS = (DOMImplementationLS)impl.getFeature(“LS”,”3.0”);

LSSerializer ser = implLS.createLSSerializer();

//需要空格和换行,设置

ser.getDomConfig().setParameter(“format-pretty-print”, true);

//可以将XML文档转换为字符串

String str = ser.writeToString(doc);

//如果想将输出直接写入文件中,需要一个LSOutput

LSOutput out = implLS.createLSOutput();

out.setEncoding(“UTF-8”);

out.setByteStream(Files.newOutputStream(path)); //指定输出到哪个文件,不存在就创建

ser.write(doc, out);

3)使用XSLT转换

XSL转换机制可以指定将XML文档转换为其他格式的规则,例如,txt纯文本、XHTML或其他任何XML格式。

用途:

XSLT通常用来将某种机器可读的XML格式转译为另一种机器可读的XML格式,或者将XML转译为适合人类阅读的表示格式

步骤:

1、        需要提供XSLT样式表,它描述了XML文档向某种格式转换的规则

2、        XSLT处理器读入XML文档XSLT样式表,产生所要的输出

XSLT样式表:

<?xml version=”1.0” encoding=”utf-8”?>

<xsl:stylesheet

Xmlns:xsl=http://www.w3c.org/1999/XSL/Transform

Version=”1.0”>

<xsl:output method=”html”/> //指定输出的格式为HTML,其他有XML、text

Template1 模板

.

.

.

Template2

</xsl:stylesheet>

模板示例:

<xsl:template match=”/staf/employee”>

<tr><xsl:apply-templates/></tr>

</xsl:template>

match属性的值是一个XPath表达式

该模板表示:每当看懂啊XPath集/staff/employee中的一个节点时

(1)   产生字符串<tr>

(2)   对于要处理的子元素继续应用模板(会递归!)

(3)   当处理完所有所有子元素后,产生字符串</tr>

把属性值复制到输出中的模板:

<xsl:template match=”/staff/employee/hiredate”>

<td><xsl:value-of  select=”@year”/>-<xsl:value-of  select=”@month”/>-<xsl:value-of select=”@day”/></td>

</xsl:template>

这里xsl:value-of语句用于计算,由select的XPath值指定的节点集(属性节点)的,字符串值

XML转HTML示例:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

version="1.0">

<xsl:output method="html"/> //指定输出为html格式

<xsl:template match="/staff"> //使用XPath来分别定位

<table border="1"><xsl:apply-templates/></table>

</xsl:template>

<xsl:template match="/staff/employee"> //使用XPath来分别定位

<tr><xsl:apply-templates/></tr>

</xsl:template>

<xsl:template match="/staff/employee/name"> //使用XPath来分别定位

<td><xsl:apply-templates/></td>

</xsl:template>

<xsl:template match="/staff/employee/salary"> //使用XPath来分别定位

<td>$<xsl:apply-templates/></td>

</xsl:template>

<xsl:template match="/staff/employee/hiredate"> //使用XPath来分别定位

<td><xsl:value-of select="@year"/>-<xsl:value-of

select="@month"/>-<xsl:value-of select="@day"/></td>

</xsl:template>

</xsl:stylesheet>

 

Java平台下的XSL转换(XSLT):

(1)为每个样式表设置一个转换器工厂,得到一个转换器对象,并让它把一个转换成结果

File styleSheet = new File(fileName); //某个xsl文件

StreamSource  styleSource = new StreamSource(styleSheet);

Transformer t = TransformerFactory.newInstance().newTransformer(styleSource);

t.transform(source, result);

(2)谈谈source和 result

Source接口有四个实现类:DOMSource、SAXSource、StAXSource、StreamSource,这些类使我们能通过文件、流、Reader、URL、DOM树节点来传入一个source

比如:来自DOM树节点的DOMSource(传入Document就相当于整个树)、

Result接口有三个实现类:DOMResult、SAXResult、StreamResult

如果要把转换结果存储到DOM树中,那就再创建一个新的文档节点包装到DOMResult中:

Document doc = builder.newDocument();

t.transform(source,  new DOMResult(doc));

如果要把转换结果保存到文件中,可以使用StreamResult

t.transform(source,  new StreamResult(file));

更多XSLT相关请点击

JavaEE XML DOM创建的更多相关文章

  1. JavaEE XML DOM创建之DOM4J

    DOM4J创建xml文档 @author ixenos 1 写出内容到xml文档 XMLWriter writer = new XMLWriter(OutputStream, OutputForamt ...

  2. JavaEE XML DOM解析之DOM4J

    DOM解析之DOM4J @author ixenos DOM4J常用API 读取xml文档: Document doc = new SAXReader().read("xml文件" ...

  3. JavaEE XML StAX创建

    StAX创建XML文档 @author ixenos 1. 如果通过DOM树来创建XML文件时,发现这个DOM树没有其他用途,那么这种方式就不是很高效,这时我们可以使用StAX API直接将XML树写 ...

  4. JavaEE XML DOM解析

    DOM解析XML @author ixenos XML解析方式(原理) a)     DOM 解析树 b)     SAX  流事件 DOM解析对应主流工具 i.          DOM(官方) i ...

  5. PHP中利用DOM创建xml文档

    DOM创建xml文档 用dom创建如下文档: <booklist> <book id="1"> <title>天龙八部</title> ...

  6. 使用DOM创建xml文件

    使用DOM创建xml文件 创建xml的代码如下: public class CreateXML { public static void main(String[] args) { DocumentB ...

  7. php XML 读写 创建

    一 .XML 读 1.1. 首先同目录定义好一个XML文件 : book.xml <?xml version="1.0" encoding="utf-8" ...

  8. htm Dom对象与 Xml Dom对象的理解

    html 是基于Xml的文档规范.是一种特殊的xml文档,这一点很重要 1.xml 文档的操作,java,c#,...各种语言都提供了很好的api对文档进行解析,操作.当然js 也不例外,提供了一系列 ...

  9. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

随机推荐

  1. jboss7.1.0配置数据库(mysql)

    以jboss7.1.0和mysql为例 1.找到安装目录,我的目录是:jboss-as-7.1.0.CR1b 2.找到standalone.xml,这个文件在我的电脑上是C:\Users\dan\De ...

  2. dcmtk常用命令

    dump2dcm 把普通文件转换成含有dcm头的文件,参数为源文件,目标文件 例:dump2dcm q1.txt query.dcm 表示把q1.txt文件转换为query.dcm dcmdump 阅 ...

  3. 史上最全的Matlab资源电子书教程和视频下载合集【超级推荐】

    收藏吧,网上搜集的,费了老大劲了,推荐给有需要的人,^_^.   MATLAB课件2007北京交通大学.zip 4.87 MB   A Guide to MATLAB for Beginners an ...

  4. 2014.3.12-C语言小测试

    测试代码: 学号:1402049 1.请实现一个函数,功能为使用循环输出以下的图案 void print_alpha(int n) { int i, j; for(i=0;i<n;++i){ f ...

  5. Plan : 破晓

    题记 : 不要因为走的太远而忘记自己为什么而出发. 1. 白书(算法竞赛入门经典)看完(每一句话都要读懂) 2. 每次听完课把当天内容复习完(自习室10点以后复习) 3. 微机实验要提前预习(把实验报 ...

  6. 生活沉思录 via 哲理小故事(四)

    1.围墙里的墓碑 第一次世界大战期间,驻守意大利某小镇的年轻军官结识了镇上的牧师.虽然军官信仰信教,而牧师是天主教牧师,但两人一见如故. 军官在一次执行任务中身负重伤,弥留之际嘱托牧师无论如何要把自己 ...

  7. TOGAF架构能力框架之架构委员会和架构合规性

    TOGAF架构能力框架之架构委员会和架构合规性 3. 架构委员会 正如前面所说,一个用来对架构治理策略的实现进行监督的跨组织的架构委员会是架构治理策略成功的主要要素之一.架构委员会应该能够代表所有主要 ...

  8. 8个免费实用的C++GUI库

    8个免费实用的C++GUI库 C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库.实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都 ...

  9. 7z文件格式及其源码

    7z文件格式及其源码的分析(四) 这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详 ...

  10. DES加密解密 与 Cookie的封装(C#与js互相加密解密)

    2D JS框架 - DES加密解密 与 Cookie的封装(C#与js互相加密解密)   这次实现了JS端的DES加密与解密,并且C#端也能正确解析DES的密文(反之也实现了) 使用的代码如下,非常方 ...