| <!-- DTD for a hypothetical media management system --> <!-- Media assets are the root of the object hierarchy. Assets are also hierarchical - they can contain other assets. --> <!ELEMENT media-asset (name, desc?, type*, media-asset*, urn)> <!-- Metadata about the asset --> <!ELEMENT name (#PCDATA)> <!ELEMENT desc (#PCDATA)> <!ELEMENT type (desc, mime-type?)> <!ELEMENT mime-type (#PCDATA)> <!ELEMENT urn (#PCDATA)> |
| <?xml version="1.0" ?><!DOCTYPE media-asset PUBLIC "-//Jim Farley//DTD Media Assets//EN" "http://localhost/Articles/Sun/dtds/media.dtd"> <media-asset> <name>第14讲</name> <desc>与第14讲相关的所有内容</desc> <!-- 内容对象"lecture 14"的一套子组件 --> <media-asset> <name>讲座的幻灯片</name> <type> <desc>MS PowerPoint</desc> <mime-type>application/vnd.ms-powerpoint</mime-type> </type> <urn>http://javatraining.org/jaf/E123/lecture- 14/slides.ppt</urn> </media-asset> <media-asset> <name>讲座的视频片断</name> <type> <desc>RealPlayer streaming video</desc> <mime-type>video/vnd.rn-realvideo</mime-type> </type> <urn>http://javatraining.org/jaf/E123/lecture- 14/lecture.rv</urn> </media-asset> <!-- 讲座开始 --> <urn>http://javatraining.org/jaf/E123/lecture-14/index.jsp</urn> </media-asset> |
| 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); } /** 解析指定的URL,返回找到的XML文档 */ 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; } /** * 错误处理代码(为简洁起见省略了) */ } |
| package jaf.xml; import java.util.*; public class MediaAsset { // 资源元数据 private String mName = ""; private String mDesc = ""; private Collection mChildren = new LinkedList(); private Vector mTypes = new Vector(); private String mUrn = ""; protected MediaAsset(org.w3c.dom.Node assetNode) { // 为简洁起见省略后面代码 . . . } } |