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;©right;</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(); }