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. sql语句 面试题

    ql语句 面试题   自动编号   学号   姓名 课程编号 课程名称 分数 1        2005001  张三  0001      数学    69 2        2005002  李四 ...

  2. 第三方控件netadvantage UltraWebGrid如何生成多级跨行表头个人总结

    1.生成多级表头,横向和纵向跨度. 1>对于有字段的的表头合并:也就是(工期.项目经理信息除外)可以在前台通过spanx和spany属性控制.对于空字段(工资.项目经理必须通过后台动态添加),而 ...

  3. WCF、Web API、WCF REST、Web Service 区别

    Web Service It is based on SOAP and return data in XML form. It support only HTTP protocol. It is no ...

  4. Windows Live Writer 完成开源并推出开源分支

    原文:Announcing Open Live Writer - An Open Source Fork of Windows Live Writer Windows Live Writer是一款发布 ...

  5. ODP.NET

    1,什么是ODT?就是Oracle 为 .NET (ODP.NET) 专门编写了 Oracle Data Provider,一个用于 Microsoft .NET 环境下的 Oracle 数据访问 A ...

  6. 重定向和VT100编程

    重定向和VT100编程 一.文件重定向     我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "h ...

  7. Java泛型学习笔记--Java泛型和C#泛型比较学习(一)

    总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...

  8. HttpClient的使用-爬虫学习(一)

    Apache真是伟大,为我们提供了HttpClient.jar,这个HttpClient是客户端的http通信实现库,这个类库的作用是接受和发送http报文,引进这个类库,我们对于http的操作会变得 ...

  9. 10.25最后的模拟赛DAY1 answer

    QAQ太困了,大概说一下自己的思路: 其实这题很容易看错题目或是想错,就比如我个傻逼,一开始以为p+q一定等于n.... 咳咳...其实这题不用想太多,我们可以通过这n个字符串一个个假设正确或是不正确 ...

  10. API HOOK库

    API HOOK库 API HOOK有两种做法,一种是SetWindowHookEx,简单易用,但如果做其它的HOOK,如HOOK OpenProcess,就需要修改内存地址了,内存地址可以通过Wri ...