在
XML
应用中,最常用也最实用的莫过于
XML
文件的读写,这里通过一个简单的
XML
文件读写来作简要分析。可以在任何文本编辑器中先建立如下结构的
XML
文件,类似于
HTML
结构,但
XML
语义比较严格,起始标记必须配对,比如
"
〈学生花名册〉
"
与
"
〈/学生花名册〉
"
对应,空格多少可不必在意,但一般都以缩格形式书写,便于阅读。把此文件命名为
Input.xml
,可以在任何支持
XML
的浏览器中打开测试一下,如果输入正确,在浏览中可以看到此文件的树形表示结构。
<
?xml
version="1.0"
encoding="GB2312"?
>
<学生花名册>
<学生 性别
=
"
男
"
>
<姓名>李华<
/
姓名>
<年龄>
14
<
/
年龄>
<电话>
6287555
<
/
电话>
<
/
学生>
<学生 性别
=
"
男
"
>
<姓名>张三<
/
姓名>
<年龄>
16
<
/
年龄>
<电话>
8273425
<
/
电话>
<
/
学生>
<
/
学生花名册>
准备工作做完后,接着就开始写实质性的
JAVA
代码了。为保存从
XML
文件读入的信息,需要先建一个简单的
Bean
来保存学生信息,命名为
StudentBean
,代码如下所示:
public
class
StudentBean
{
private
String
sex;
//
学生性别
private
String
name;
//
学生姓名
private
int
age;
//
学生年龄
private
String
phone;
//
电话号码
public
void
setSex(String
s)
{
sex
=
s;
}
public
void
setName(String
s)
{
name
=
s;
}
public
void
setAge(int
a)
{
age
=
a;
}
public
void
setPhone(String
s)
{
phone
=
s;
}
public
String
getSex()
{
return
sex;
}
public
String
getName()
{
return
name;
}
public
int
getAge()
{
return
age;
}
public
String
getPhone()
{
return
phone;
}
}
之后写
XML
的测试类,笔者把这个类命名为
XMLTest
,为了读写
XML
文件,需要导入如下
JAVA
包,
"//"
后为注释说明,笔者的环境是
JDK
1.3.1
_04
,在
JDK
1.4.0
中测试也通过,
XML
解释器用
Apache
的
Crimson
,可以到
Apache
主页去上载。
import
java.io.*;
//Java
基础包,包含各种
IO
操作
import
java.util.*;
//Java
基础包,包含各种标准数据结构操作
import
javax.xml.parsers.*;
//XML
解析器接口
import
org.w3c.dom.*;
//XML
的
DOM
实现
import
org.apache.crimson.tree.XmlDocument;//
写
XML
文件要用到
为了保存多个学生信息,还得借助一个集合类
(
并不是单纯意义上的集合,
JAVA
中的集合是集合框架的概念,包含向量、列表、哈希表等),这里采用
Vector
向量类。定义在
XMLTest
测试类中,命名为
student_Vector
。然后定义两个方法
readXMLFile
和
writeXMLFile
,实现读写操作。代码如下:
private
void
readXMLFile(String
inFile)
throws
Exception
{
//
为解析
XML
作准备,创建
DocumentBuilderFactory
实例
,
指定
DocumentBuilder
DocumentBuilderFactory
dbf
=
DocumentBuilderFactory.newInstance();
DocumentBuilder
db
=
null;
try
{
db
=
dbf.newDocumentBuilder();
}catch
(ParserConfigurationException
pce)
{
System.err.println(pce);
//
出异常时输出异常信息,然后退出,下同
System.exit(1);
}
Document
doc
=
null;
try
{
doc
=
db.parse(inFile);
}
catch
(DOMException
dom)
{
System.err.println(dom.getMessage());
System.exit(1);
}
catch
(IOException
ioe)
{
System.err.println(ioe);
System.exit(1);
}
//
下面是解析
XML
的全过程,比较简单,先取根元素
"
学生花名册
"
Element
root
=
doc.getDocumentElement();
//
取
"
学生
"
元素列表
NodeList
students
=
root.getElementsByTagName("
学生
");
for
(int
i
=
0;
i
<
students.getLength();
i++)
{
//
依次取每个
"
学生
"
元素
Element
student
=
(Element)
students.item(i);
//
创建一个学生的
Bean
实例
StudentBean
studentBean
=
new
StudentBean();
//
取学生的性别属性
studentBean.setSex(student.getAttribute("
性别
"));
//
取
"
姓名
"
元素,下面类同
NodeList
names
=
student.getElementsByTagName("
姓名
");
if
(names.getLength()
==
1)
{
Element
e
=
(Element)
names.item(0);
Text
t
=
(Text)
e.getFirstChild();
studentBean.setName(t.getNodeValue());
}
NodeList
ages
=
student.getElementsByTagName("
年龄
");
if
(ages.getLength()
==
1)
{
Element
e
=
(Element)
ages.item(0);
Text
t
=
(Text)
e.getFirstChild();
studentBean.setAge(Integer.parseInt(t.getNodeValue()));
}
NodeList
phones
=
student.getElementsByTagName("
电话
");
if
(phones.getLength()
==
1)
{
Element
e
=
(Element)
phones.item(0);
Text
t
=
(Text)
e.getFirstChild();
studentBean.setPhone(t.getNodeValue());
}
student_Vector.add(studentBean);
}
}
private
void
writeXMLFile(String
outFile)
throws
Exception
{
//
为解析
XML
作准备,创建
DocumentBuilderFactory
实例
,
指定
DocumentBuilder
DocumentBuilderFactory
dbf
=
DocumentBuilderFactory.newInstance();
DocumentBuilder
db
=
null;
try
{
db
=
dbf.newDocumentBuilder();
}
catch
(ParserConfigurationException
pce)
{
System.err.println(pce);
System.exit(1);
}
Document
doc
=
null;
doc
=
db.newDocument();
//
下面是建立
XML
文档内容的过程,先建立根元素
"
学生花名册
"
Element
root
=
doc.createElement("
学生花名册
");
//
根元素添加上文档
doc.appendChild(root);
//
取学生信息的
Bean
列表
for
(int
i
=
0;
i
<
student_Vector.size();
i++)
{
//
依次取每个学生的信息
StudentBean
studentBean
=
(StudentBean)
student_Vector.get(i);
//
建立
"
学生
"
元素,添加到根元素
Element
student
=
doc.createElement("
学生
");
student.setAttribute("
性别
",
studentBean.getSex());
root.appendChild(student);
//
建立
"
姓名
"
元素,添加到学生下面,下同
Element
name
=
doc.createElement("
姓名
");
student.appendChild(name);
Text
tName
=
doc.createTextNode(studentBean.getName());
name.appendChild(tName);
Element
age
=
doc.createElement("
年龄
");
student.appendChild(age);
Text
tAge
=
doc.createTextNode(String.valueOf(studentBean.getAge()));
age.appendChild(tAge);
Element
phone
=
doc.createElement("
电话
");
student.appendChild(phone);
Text
tPhone
=
doc.createTextNode(studentBean.getPhone());
phone.appendChild(tPhone);
}
//
把
XML
文档输出到指定的文件
FileOutputStream
outStream
=
new
FileOutputStream(outFile);
OutputStreamWriter
outWriter
=
new
OutputStreamWriter(outStream);
((XmlDocument)
doc).write(outWriter,
"GB2312");
outWriter.close();
outStream.close();
}
最后加入测试主函数,如下:
public
static
void
main(String[]
args)
throws
Exception
{
//
建立测试实例
XMLTest
xmlTest
=
new
XMLTest();
//
初始化向量列表
xmlTest.student_Vector
=
new
Vector();
System.out.println("
开始读
Input.xml
文件
");
xmlTest.readXMLFile("Input.xml");
System.out.println("
读入完毕
,
开始写
Output.xml
文件
");
xmlTest.writeXMLFile("Output.xml");
System.out.println("
写入完成
");
}
好了,保存好
StudentBean
和
XMLTest
,把
Input.xml
保存到工作目录下。如果您输入很仔细,没敲错字母的话,可以看到
"
写入完成
"
了,去瞧瞧
Output.xml
文件和
Input.xml
文件是不是一样吧。