使用DOM生成XML文件

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
6.11   使用DOM生成XML文件
解析器通过在内存中建立和XML结构相对应的树状结构数据,使得应用程序可以方便地获得XML文件中的数据。JAXP也提供了使用内存中的树状结构数据建立一个XML文件的API,即使用解析器得到的Document对象建立一个新的XML文件。
1 .Transformer对象
我们已经知道,解析器的parse方法将整个被解析的XML文件封装成一个Document节点返回,我们可以对Document节点进行修改,然后使用 Transformer对象将一个Document节点变换为一个XML文件。
即使解析器不调用parse方法,也可以得到一个Document节点。解析器通过调用newDocument()可得到一个Document节点,例如:
Document  document= builder.newDocument();
应用程序可通过修改这样的Document节点,然后使用 Transformer对象将一个Document节点变换为一个XML文件。
使用 Transformer对象将一个Document节点变换为一个XML文件需要经过如下  步骤。
使用javax.xml.transform包中的TransformerFactory类建立一个对象:
TransformerFactory transFactory=TransformerFactory. newInstance()
步骤 中得到的transFactory对象调用newTransformer()方法得到一个Transformer对象:
Transformer transformer=transFactory. newTransformer();
Transformer类在javax.xml.transform包中。
将被变换的Document对象封装到一个DOMSource对象中:
DOMSource  domSource= new  DOMSource(document);
DOMSource类在javax.xml.transform.dom包中。
将变换得到XML文件对象封装到一个StreamResult对象中:
File file= new  File( "newXML.xml" );
FileOutputStream out= new  FileOutputStream(file);
StreamResult xmlResult= new  StreamResult(out);
StreamResult类在javax.xml.transform.stream包中。
最后,Transformer 对象transformer 调用transform方法实施变换:
transformer.transform(domSource, xmlResult);
2 .用于修改Document的常用方法
Node接口是Document的父接口,提供了许多用来修改、增加和删除节点的方法:
Node appendChild(Node newChild) 节点调用该方法可以向当前节点增加一个新的子节点,并返回这个新节点。
Node removeChild(Node oldChild)  throws  DOMException节点调用该方法删除参数指定的子节点,并返回被删除的子节点。
Node replaceChild(Node newChild, Node oldChild) 节点调用该方法可以替换子节点,并返回被替换的子节点。
Element接口本身除了从Node接口继承的方法外,也提供了用来增加节点的方法:
Attr removeAttributeNode(Attr oldAttr) 删除Element节点的属性。
void  setAttribute(String name, String value)为Element节点增加新的属性及属性值,如果该属性已经存在,新的属性将替换旧的属性。
Text接口本身除了从Node接口继承的方法外,也提供了用来修改节点内容的方法:
Text replaceWholeText(String content) 替换当前Text节点的文本内容。
void  appendData(String arg) 向当前Text节点尾加文本内容。
void  insertData( int  offset, String arg) 向当前Text节点插入文本内容,插入的位置由参数offset指定,即第offset个字符的后继位置。
void  deleteData( int  offset, int  count) 删除当前节点的文本内容中的一部分。被删除的范围由参数offset和count指定,即从第offset个字符后续的count个字符。
void  replaceData( int  offset, int  count, String arg)将当前Text节点中文本内容的一部分替换为参数arg指定的内容,被替换的范围由参数offset和count指定,即从第offset个字符后续的count个字符。
3 .用DOM建立XML文件
在下面的例子 10 中,解析器解析一个XML文件:“cha6_10.xml”,然后修改Document对象,并用Transformer得到一个新的XML文件:“newXML.xml”。
例子 10
Cha6_10.xml
<?xml  version= "1.0"   encoding= "UTF-8"  ?>
<考试成绩单>
<高等数学>
<考生姓名>张三 </考生姓名>
<成绩>  89  </成绩>
</高等数学>
<高等数学>
<考生姓名> 李四 </考生姓名>
<成绩>  66  </成绩>
</高等数学>
</考试成绩单>
JAXPTen.java
import  javax.xml.transform.*;
import  javax.xml.transform.stream.*;
import  javax.xml.transform.dom.*;
import  org.w3c.dom.*;
import  javax.xml.parsers.*;
import  java.io.*;
public  class  JAXPTen
{
public  static  void  main(String args[])
{
ModifyNode modify= new  ModifyNode();
try  {
DocumentBuilderFactory  factory=
DocumentBuilderFactory. newInstance();
DocumentBuilder  builder= factory. newDocumentBuilder();
Document  document= builder. parse( new  File( "Cha6_10.xml" )) ;
Element root=document.getDocumentElement() ;
NodeList nodeList=root.getChildNodes();
modify.modifyNode(nodeList);
TransformerFactory transFactory=TransformerFactory. newInstance();
Transformer transformer=transFactory. newTransformer();
DOMSource  domSource= new  DOMSource(document);
File file= new  File( "newXML.xml" );
FileOutputStream out= new  FileOutputStream(file);
StreamResult xmlResult= new  StreamResult(out);
transformer.transform(domSource, xmlResult);
}         
catch (Exception e)
{
System.out.println(e);
}
}
}
class   ModifyNode
{
int  m= 0 ;
public  void  modifyNode(NodeList nodeList)
{
int  size=nodeList.getLength();
for ( int  k= 0 ;k<size;k++)
{
Node node=nodeList.item(k);
if (node.getNodeType()==Node.TEXT_NODE)
{
Text textNode=(Text)node;
int  length=textNode.getLength();
String str=textNode.getWholeText().trim();
try {
double  d=Double.parseDouble(str);
if (d>= 90 &&d<= 100 )
textNode.insertData(length, "(优dd秀)" );
else   if (d>= 80 &&d< 90 )
textNode.insertData(length, "(良好)" );
else   if (d>= 60 &&d< 80 )
textNode.insertData(length, "(及格)" );
else
textNode.insertData(length, "(不及格)" );
}
catch (NumberFormatException ee)
{}               
}
if (node.getNodeType()==Node.ELEMENT_NODE)
{
Element elementNode=(Element)node;
String name=elementNode.getNodeName();
if (elementNode.hasChildNodes())
{
elementNode.setAttribute( "考试性质" , "闭卷" ) ;
}
NodeList nodes=elementNode.getChildNodes();
modifyNode(nodes);
}
}
}
}
上述例子 10 得到的XML文件“newXML.xml”的内容如下:
newXML.xml
<?xml version= "1.0"  encoding= "UTF-8" ?><考试成绩单>
<高等数学 考试性质= "闭卷" >
<考生姓名 考试性质= "闭卷" >张三 </考生姓名>
<成绩 考试性质= "闭卷" 89  (良好)</成绩>
</高等数学>
<高等数学 考试性质= "闭卷" >
<考生姓名 考试性质= "闭卷" > 李四 </考生姓名>
<成绩 考试性质= "闭卷" 66  (及格)</成绩>
</高等数学>
</考试成绩单>
上述例子 10 中的DOM解析器利用已知的XML文件产生一个Document对象,然后对内存中的Document对象修改后,再生成一个新的XML文件。在下面的例子 11 中,DOM解析器调用newDocument()得到一个Document对象,“JavaEleven.java”产生的XML文件是“火车时刻表.xml”,用浏览器打开它的效果如图 6.12 所示。
6.12   用DOM生成的XML文件
例子 11
JAXPEleven.java
import  javax.xml.transform.*;
import  javax.xml.transform.stream.*;
import  javax.xml.transform.dom.*;
import  org.w3c.dom.*;
import  javax.xml.parsers.*;
import  java.io.*;
public  class  JAXPEleven
{
public  static  void  main(String args[])
{
try  {
String  train[]={ "T126次" , "K256次" , "L345次" },
type[] ={ "特快" , "普快" , "临客" },
startTime []={ "18:36" , "22:56" , "10:12" };
DocumentBuilderFactory  factory=
DocumentBuilderFactory. newInstance();
DocumentBuilder  builder= factory. newDocumentBuilder();
Document  document= builder.newDocument();
document.setXmlVersion( "1.0" );
Element 火车时刻表=document.createElement( "火车时刻表" );
document.appendChild(火车时刻表);
for ( int  k= 1 ;k<=train.length;k++)
{
火车时刻表.appendChild(document.createElement( "车次" ));
}
NodeList  nodeList=document.getElementsByTagName( "车次" );
int  size=nodeList.getLength();
for ( int  k= 0 ;k<size;k++)
{
Node node=nodeList.item(k);
if (node.getNodeType()==Node.ELEMENT_NODE)
{
Element elementNode=(Element)node;
elementNode.setAttribute( "类别" , type[k]);
elementNode.appendChild(document.createElement( "名字" ));
elementNode.appendChild(document.createElement( "开车时间" ));
}
}
nodeList=document.getElementsByTagName( "名字" );
size=nodeList.getLength();
for ( int  k= 0 ;k<size;k++)
{
Node node=nodeList.item(k);
if (node.getNodeType()==Node.ELEMENT_NODE)
{
Element elementNode=(Element)node;
elementNode.appendChild(document.createTextNode(train[k]));
}
}
nodeList=document.getElementsByTagName( "开车时间" );
size=nodeList.getLength();
for ( int  k= 0 ;k<size;k++)
{
Node node=nodeList.item(k);
if (node.getNodeType()==Node.ELEMENT_NODE)
{
Element elementNode=(Element)node;
elementNode.appendChild(document.createTextNode
(startTime[k]));
}
}
TransformerFactory transFactory=TransformerFactory.newInstance();
Transformer transformer=transFactory.newTransformer();
DOMSource  domSource= new  DOMSource(document);
File file= new  File( "火车时刻表.xml" );
FileOutputStream out= new  FileOutputStream(file);
StreamResult xmlResult= new  StreamResult(out);
transformer.transform(domSource, xmlResult);
}
catch (Exception e)
{
System.out.println(e);
}
}      
}
















本文转自yunlielai51CTO博客,原文链接:http://blog.51cto.com/4925054/1281625,如需转载请自行联系原作者

相关文章
|
5月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
130 1
|
7月前
|
XML JavaScript Java
【JAVA XML 探秘】DOM、SAX、StAX:揭秘 Java 中 XML 解析技术的终极指南!
【8月更文挑战第25天】本文详细探讨了Java中三种主流的XML解析技术:DOM、SAX与StAX。DOM将XML文档转换为树状结构,便于全方位访问和修改;SAX采取事件驱动模式,适用于大型文件的顺序处理;StAX则兼具DOM和SAX的优点,支持流式处理和随机访问。文中提供了每种技术的示例代码,帮助读者理解如何在实际项目中应用这些解析方法。
302 1
|
7月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
4月前
|
XML Android开发 数据格式
Eclipse 创建 XML 文件
Eclipse 创建 XML 文件
71 2
|
4月前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
429 8
|
5月前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
56 3
|
5月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
226 0
|
5月前
|
XML 存储 Web App开发
查看 XML 文件
查看 XML 文件
|
6月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
103 1
|
7月前
|
XML 数据格式
Dom4j 保存XML HL7-V3
Dom4j 保存XML HL7-V3
25 0