DTD

xiaoxiao2021-02-28  35

1.指定文档结构:可以提供一个DTD(Document Type Definition)或者一个Scheme定义;

    包含了规则:用于解释文档应该如何构成

    这些规则指定了每个元素的合法子元素和属性

2.例如:DTD <!Element font(name,size)> 即元素font包含两个子元素,name、size;

3.XML Scheme约束:如下

<xsd: element name="font"> <xsd:sequence> <xsd:element name="name" type="xsd:string"> <xsd:element name="size" type="xsd:int"> </xsd:sequence> </xsd:element>

与DTD相比,Scheme表达更加复杂的验证条件,约束更加详细,但是XML Scheme相对而言很复杂。所以两种方式

都有存在的价值,DTD仍然有很强的生命力

/****************************************************************************/

1、提供DTD的方式有多种:例如,

<?xml version="1.0"?> <!DOCTYPE configuration[ <!ELEMENT configuration...........>//根元素必须要有 more rules .... ]> <configuration> ............. </configuration>这种是纳入到了DOCTYPE声明中,使用代码块[........]限定其界限,且必须匹配根元素; 2、DTD会使文件长度变得很长,在XML文档内部提供DTD不是很普遍,因此,将其存储在外面更有意义:

SYSTEM声明可以实现这个目标,可以指定一个包含DTD的URL:

<!DOCTYPE configuration SYSTEM "config.dtd"> or <!DOCTYPE configuration SYSTEM "http://myserver.com/config.dtd">

当使用的是相对URL时,需要给解析器一个File或者URL对象,而不是InputStream。

如果必须从一个输入流来解析,提供一个实体解析器:

<!DOCTYPE web-app     PUBLIC"-//Sun Microsystems,Inc.//DTD Web Application2.2//EN"     "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <!--如果XML处理器知道如何定位带有PUBLIC标识的DTD,那么就不需要URL-->

如果使用的是DOM解析器,若想支持PUBLIC标识符,只需调用DocumentBuilder类的setEntityResolver方法

来安装EntityResolver接口的某个实现类的一个对象即可:

该接口只有一个方法:resolveEntity,典型的实现的代码如下:

class MysEntityResolver implements EntityResolver{     public InputSource resolveEntity(String publicID,String systemID){         if(publicID.equals(a known ID))             return new InputSource(DTD data);         else             return null;     } } //可以从InputStream,Reader或字符串构建输入源

3、不同类型的规则

    ELEMENT规则用于指定某个元素可以拥有怎么样的子元素;

<!ELEMENT menu(item)*><!--声明元素menu包含0个或多个item元素--> <!ELEMENT font(name,size)><!--声明font元素包含name和size两个子元素--> <!ELEMENT name(#PCDATA)><!--声明name元素包含文本--> <!ELEMNET size(#PCDATA)><!--声明size元素包含文本-->

4、元素属性的规则

<!ATTLIST font style(plain|bold|italic|bold-italic) "plain">//style属性有四个合法属性值,其中plain是默认的 <!ATTLIST size unit CDATA #IMPLIED>//unit属性可以包含任意字符数据序列

5.安装错误处理器

通过DocumentBuilder类的setErrorHandler

builder.setErrorHandler(handler);

    

转载请注明原文地址: https://www.6miu.com/read-2625041.html

最新回复(0)