Notes d'étude Crazy XML (3) -----------XML et DTD

黄舟
Libérer: 2017-02-21 14:14:27
original
1336 Les gens l'ont consulté

Document Type Definition (DTD) définit les éléments de base juridiques des documents XML. Il utilise une série d'éléments juridiques pour définir la structure du document.

La DTD peut être déclarée dans un document XML sous forme de ligne ou de référence externe.

Déclaration DOCTYPE interne

Si la DTD est incluse dans votre fichier source XML, elle doit transmettre la syntaxe suivante Encapsulée dans une déclaration DOCTYPE :

<!DOCTYPE 根元素 [元素声明]>
Copier après la connexion

Instance de document XML avec DTD

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don&#39;t forget the meeting!</body>
</note>
Copier après la connexion

La DTD ci-dessus s'explique comme suit :

!DOCTYPE note (deuxième ligne) définit que ce document est de type note document.

!ELEMENT note (Troisième ligne) Définition L'élément note comporte quatre éléments : "vers, depuis, titre, corps"

!ELEMENT to (la quatrième ligne) définit l'élément to comme type "#PCDATA"

!ELEMENT from (cinquième ligne) définit l'élément frome comme type "#PCDATA"

!ELEMENT en-tête (Sixième ligne) Définition heading l'élément est de type "#PCDATA"

!ELEMENT body (Septième ligne) Définition< 🎜 L'élément >body est de type "#PCDATA"

Déclaration de document externe

Si la DTD se trouve en dehors du fichier source XML, alors elle doit être encapsulée dans une définition DOCTYPE en utilisant la syntaxe suivante :

<!DOCTYPE 根元素 SYSTEM "文件名">
Copier après la connexion

Ce document XML est le même que le XML document ci-dessus, mais possède une DTD externe : (Et sélectionnez la commande "Afficher la source".)

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>
Copier après la connexion

Voici le fichier "note.dtd" contenant la DTD :

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
Copier après la connexion

Pourquoi utiliser la DTD ?

Avec une DTD, chacun de vos fichiers XML peut porter une description de son propre format.

Avec DTD, les groupes indépendants peuvent systématiquement utiliser une DTD standard pour échanger des données.

Votre application peut également utiliser une DTD standard pour valider les données reçues de l'extérieur.

Vous pouvez également utiliser des DTD pour vérifier vos propres données.

Module de création de documents XML

Tous les documents XML (ainsi que les documents HTML) sont composés des blocs de construction simples suivants :

  • Élément

  • Attributs

  • Entité

  • PCDATA

  • CDATA

Vous trouverez ci-dessous une brève description de chaque élément constitutif. L'élément

L'élément

est l'élément principal de XML et les documents HTML .

Des exemples d'éléments HTML sont "body" et "table". Des exemples d'éléments XML sont "note" et "message" . Les éléments peuvent contenir du texte, d'autres éléments ou être vides. Des exemples d'éléments HTML vides sont "hr", "br" et "img".

Instance :

<body>body text in between</body>
<message>some message in between</message>
Copier après la connexion

Attributs

Les attributs fournissent des informations supplémentaires sur l'élément. L'attribut

est toujours placé dans la balise d'ouverture d'un élément. Les propriétés apparaissent toujours par paires nom/valeur. L'élément "img" suivant contient des informations supplémentaires sur le fichier source :

<img src="computer.gif" />
Copier après la connexion

Le nom de l'élément est "img". Le nom de l'attribut est "src". La valeur de la propriété est "computer.gif". Puisque l'élément lui-même est vide, il est fermé par un " /".

Entité

实体是用来定义普通文本的变量。实体引用是对实体的引用。

大多数同学都了解这个 HTML 实体引用:" "。这个“无折行空格”实体在 HTML 中被用于在某个文档中插入一个额外的空格。

当文档被 XML 解析器解析时,实体就会被展开。

下面的实体在 XML 中被预定义:

实体引用字符
<<
>>
&&
""
''

PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。

不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。


在一个 DTD 中,元素通过元素声明来进行声明。

声明一个元素

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:

<!ELEMENT 元素名称 类别>
Copier après la connexion

或者

<!ELEMENT 元素名称 (元素内容)>
Copier après la connexion

空元素

空元素通过类别关键词EMPTY进行声明:

<!ELEMENT 元素名称 EMPTY>
Copier après la connexion

例子:

<!ELEMENT br EMPTY>
Copier après la connexion

XML例子:

<br />
Copier après la connexion

只有 PCDATA 的元素

只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

<!ELEMENT 元素名称 (#PCDATA)>
Copier après la connexion

例子:

<!ELEMENT from (#PCDATA)>
Copier après la connexion

带有任何内容的元素

通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>
Copier après la connexion

例子:

<!ELEMENT note ANY>
Copier après la connexion

带有子元素(序列)的元素

带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

<!ELEMENT 元素名称 (子元素名称 1)>
Copier après la connexion

或者

<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
Copier après la connexion

例子:

<!ELEMENT note (to,from,heading,body)>
Copier après la connexion

当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:

<!ELEMENT note (to,from,heading,body)>



Copier après la connexion

声明只出现一次的元素

<!ELEMENT 元素名称 (子元素名称)>
Copier après la connexion

例子:

<!ELEMENT note (message)>
Copier après la connexion

上面的例子声明了:message 子元素必须出现一次,并且必须只在 "note" 元素中出现一次。

声明最少出现一次的元素

<!ELEMENT 元素名称 (子元素名称+)>
Copier après la connexion

例子:

<!ELEMENT note (message+)>
Copier après la connexion

上面的例子中的加号声明了:message 子元素必须在 "note" 元素内出现至少一次。

声明出现零次或多次的元素

<!ELEMENT 元素名称 (子元素名称*)>
Copier après la connexion

例子:

<!ELEMENT note (message*)>
Copier après la connexion

上面的例子中的星号声明了:子元素 message 可在 "note" 元素内出现零次或多次。

声明出现零次或一次的元素

<!ELEMENT 元素名称 (子元素名称?)>
Copier après la connexion

例子:

<!ELEMENT note (message?)>
Copier après la connexion

上面的例子中的问号声明了:子元素 message 可在 "note" 元素内出现零次或一次。

声明“非.../既...”类型的内容

例子:

<!ELEMENT note (to,from,header,(message|body))>
Copier après la connexion

上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。

声明混合型的内容

例子:

<!ELEMENT note (#PCDATA|to|from|header|message)*>
Copier après la connexion

上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

声明属性

属性声明拥使用下列语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>
Copier après la connexion

DTD 实例:

<!ATTLIST payment type CDATA "check">
Copier après la connexion

XML 实例:

<payment type="check" />
Copier après la connexion
Copier après la connexion

以下是属性类型的选项:

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

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

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

规定一个默认的属性值

DTD:

<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
Copier après la connexion

合法的 XML:

<square width="100" />
Copier après la connexion

在上面的例子中,"square" 被定义为带有 CDATA 类型的 "width" 属性的空元素。如果宽度没有被设定,其默认值为0 。

#IMPLIED

语法

<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>
Copier après la connexion

例子

DTD:

<!ATTLIST contact fax CDATA #IMPLIED>
Copier après la connexion

合法的 XML:

<contact fax="555-667788" />
Copier après la connexion

合法的 XML:

<contact />
Copier après la connexion

假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词 #IMPLIED。

#REQUIRED

语法

<!ATTLIST 元素名称 属性名称 属性类型 #REQUIRED>
Copier après la connexion

例子

DTD:

<!ATTLIST person number CDATA #REQUIRED>
Copier après la connexion

合法的 XML:

<person number="5677" />
Copier après la connexion

非法的 XML:

<person />
Copier après la connexion

假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词 #REQUIRED。

#FIXED

语法

<!ATTLIST 元素名称 属性名称 属性类型 #FIXED "value">
Copier après la connexion

例子

DTD:

<!ATTLIST sender company CDATA #FIXED "Microsoft">
Copier après la connexion

合法的 XML:

<sender company="Microsoft" />
Copier après la connexion

非法的 XML:

<sender company="W3School" />
Copier après la connexion

如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用 #FIXED 关键词。如果作者使用了不同的值,XML 解析器会返回错误。

列举属性值

语法:

<!ATTLIST 元素名称 属性名称 (en1|en2|..) 默认值>
Copier après la connexion

DTD 例子:

<!ATTLIST payment type (check|cash) "cash">
Copier après la connexion

XML 例子:

<payment type="check" />
Copier après la connexion
Copier après la connexion

或者

<payment type="cash" />
Copier après la connexion

如果您希望属性值为一系列固定的合法值之一,请使用列举属性值。


实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。

实体引用是对实体的引用。

实体可在内部或外部进行声明。

一个内部实体声明

语法:

<!ENTITY 实体名称 "实体的值">
Copier après la connexion

例子:

DTD 例子:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
Copier après la connexion

XML 例子:

<author>&writer;&copyright;</author>
Copier après la connexion
Copier après la connexion

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

一个外部实体声明

语法:

<!ENTITY 实体名称 SYSTEM "URI/URL">
Copier après la connexion

例子:

DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
Copier après la connexion

XML 例子:

<author>&writer;&copyright;</author>
Copier après la connexion
Copier après la connexion

通过 XML 解析器进行验证

当您试图打开某个 XML 文档时,XML 解析器有可能会产生错误。通过访问 parseError 对象,就可以取回引起错误的确切代码、文本甚至所在的行。

注释:load( ) 方法用于文件,而 loadXML( ) 方法用于字符串。

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true"
xmlDoc.load("note_dtd_error.xml")

document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)
Copier après la connexion

关闭验证

通过把 XML 解析器的 validateOnParse 设置为 "false",就可以关闭验证。

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="false"
xmlDoc.load("note_dtd_error.xml")

document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)
Copier après la connexion

Try it Yourself

通用的 XML 验证器

为了帮助您验证 XML 文件,我们创建了此链接,这样你就可以验证任何 XML 文件了。

parseError 对象

电视节目表 DTD

<!DOCTYPE TVSCHEDULE [

<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)> 
<!ELEMENT DESCRIPTION (#PCDATA)>

<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>

]>
Copier après la connexion

报纸文章 DTD

<!DOCTYPE NEWSPAPER [ 

<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)> 

<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>

<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">

]>
Copier après la connexion

产品目录 DTD

拷贝自:http://www.php.cn/

<!DOCTYPE CATALOG [

<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">

<!ELEMENT CATALOG (PRODUCT+)>

<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">

<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>

<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte" 
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">

<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>

<!ELEMENT NOTES (#PCDATA)>

]>
Copier après la connexion

 

以上就是疯狂XML学习笔记(3)-----------XML与DTD 的内容,更多相关内容请关注PHP中文网(www.php.cn)!

 

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal