从
Web
或者企业级应用的角度看,能以这种方式访问数据真是一种福音,因为它体现了高度的可移动性,使我们与元数据的实际资源本身隔离。这些资源可能来自一个关系数据库系统、某种活动媒体服务器或者
Web
服务器上的一个静态
XML
文档,等等。如果想把这些数据加载到
Java
应用中,我们可以从当前众多的
Java
语言
XML
解析器中选用一个,通过它将
XML
数据装入一个
DOM
文档,最后遍历文档,将所有这些数据转换到我们应用系统的对象模型中。
下面是个简单的基于
DOM
的解析程序,可对上述的媒体
DTD
进行解析。解析器用的是
Apache Xerces
:
package jaf
.
xml
;
import java
.
util
.
*
;
import java
.
io
.
IOException
;
import org
.
w3c
.
dom
.
*
;
import org
.
xml
.
sax
.
*
;
// XML
文档解析程序,使用上述媒体
DTD
.
public class MediaParser implements ErrorHandler {
/**
使用
Apache Xerces
解析器
*/
org
.
apache
.
xerces
.
parsers
.
DOMParser mParser
=
new org
.
apache
.
xerces
.
parsers
.
DOMParser
();
/**
构造函数
*/
public MediaParser
()
{
//
告诉解析器验证并解析文档
try {
mParser
.
setFeature
(
"http
:
//xml
.
org/sax/features/validation"
,
true
);
}
catch
(
SAXException e
)
{
System
.
out
.
println
(
"Error setting validation on parser
:
"
);
e
.
printStackTrace
();
}
mParser
.
setErrorHandler
(
this
);
}
*/
public Document parse
(
String url
)
throws SAXException
,
IOException {
mParser
.
parse
(
url
);
Document mediaDoc
=
mParser
.
getDocument
();
return mediaDoc
;
}
/**
解析指定
URL
的
XML
文档,将内容转换成
MediaAsset
对象
*/
public Collection loadAssets
(
String url
)
throws SAXException
,
IOException {
Document doc
=
parse
(
url
);
Collection assets
=
new LinkedList
();
NodeList assetNodes
=
doc
.
getElementsByTagName
(
"media
-
asset"
);
for
(
int i
=
0
;
i < assetNodes
.
getLength
();
i
++)
{
Node assetNode
=
assetNodes
.
item
(
i
);
MediaAsset asset
=
new MediaAsset
(
assetNode
);
assets
.
add
(
asset
);
}
return assets
;
}
/**
*
错误处理代码(为简洁起见省略了)
*/
}