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声明中,使用代码块[........]限定其界限,且必须匹配根元素;
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);