DTD 定义和验证

http://www.w3school.com.cn/dtd/dtd_attributes.asp

 

DTD 定义有:

<!ELEMENT 元素名称 类别>

类别包括:#PCDATA|EMPTY|ANY|XXXXXX

其中 XXXXXX 代表: 具体的元素名称

+,*,?,| 可以用来修饰类别个数或非...既..., 如 

<!ELEMENT note (message*)>

<!ELEMENT note (to,from,header,(message|body))>

<!ELEMENT note (#PCDATA|to|from|header|message)*>

--------------------------------------------------------------------------------------------------------

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

 

以下是属性类型的选项:

类型描述
CDATA 值为字符数据 (character data)
(en1|en2|..) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值

默认值参数可使用下列值:

解释
属性的默认值
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的

<!ELEMENT square EMPTY> <!ATTLIST square width CDATA "0">

<square width="100" />


<!ATTLIST sender company CDATA #FIXED "Microsoft">

<sender company="Microsoft" />

 

--------------------------------------------------------------------------------------------------------

属性类型中的 "实体"

<!ENTITY 实体名称 "实体的值">

内部定义实体方式:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

外部定义实体方式:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

这样在XML中,可以通过 &实体名称; 来代表具体的实体值:
<author>&writer;&copyright;</author>

 ==================================================================

 

DTD验证时, XML需要必须通过以下两种方式声明:

 

内部声明:

<!DOCTYPE 根元素 [元素声明]>

如:

<?xml version="1.0"?>

<!DOCTYPE 根元素 [

  <!ELEMENT ...>

  <!ELEMENT ...>

  <!ELEMENT ...>

]>

<根元素>

  <子元素 />

  <子元素 />

  <子元素 />

  ......

</根元素>

 

--------------------------------------------------------------------------------------------------------

外部声明:

 

1) 如果所定义DTD是可以共用,具备规范性的,可以这样声明 <!DOCTYPE 根元素 PUBLIC "注册//组织//类型 标签 定义//语言" "URL">

 

"定义" 取值: Strict|Transitional|Frameset (对于自定义的,可以不设置值)

 

通常设置如下:

<!DOCTYPE 根元素 PUBLIC "+//自定义//DTD 自定义//EN" "http://www....../文件名">

<!DOCTYPE 根元素 PUBLIC "-//自定义//DTD 自定义//EN" "http://www....../文件名">

 

2) 如果所定义DTD是针对本地XML,可以这样声明 <!DOCTYPE 根元素 SYSTEM "文件名">, 这样只要把DTD文件放置在XML文件所在的盘符根下就可以.

 

private void CheckXML(string fullname)
        {
            XmlReader xmlReader = XmlReader.Create(fullname, new XmlReaderSettings
            {
                ProhibitDtd = false, 
                ValidationType = ValidationType.DTD
            });
            while (true)
            {
                try
                {
                    if (!xmlReader.Read())
                    {
                        break;
                    }
                }
                catch (Exception ex)
                {
                    //TODO: do something
                }
            }
            xmlReader.Close();
        }

 

posted @ 2011-10-06 11:35  Yu  阅读(513)  评论(0编辑  收藏  举报