在
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
包,
"http://"
后為注釋說明,筆者的環境是
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
文件是不是一樣吧。