Maison  >  Article  >  développement back-end  >  Exemple de code pour une définition de type de document DTD entièrement analysée en XML (image)

Exemple de code pour une définition de type de document DTD entièrement analysée en XML (image)

黄舟
黄舟original
2017-03-13 17:51:321541parcourir

La fonction de personnalisation de la balise

XML est très puissante. Par exemple, la DTD (Document Définition du type) qui sera expliquée dans cet article amène les gens. une sorte de sentiment orienté objet, eh bien, jetons un coup d'œil à l'analyse complète de la définition du type de fichier DTD en XML

1. Qu'est-ce que la DTD
.
Le nom complet de DTD est Document Type Definition. Il s'agit d'un format de définition de fichier qui spécifie la structure du fichier XML et fournit la syntaxe et les règles pour les fichiers XML. Définissez la structure du fichier XML dans la DTD, puis écrivez le fichier XML conformément à la déclaration de la DTD. C'est tout comme la définition de la fonction dans le langage de programmation Lors de l'utilisation d'une fonction, elle doit être citée selon le format de la déclaration de la fonction.
Exemple de code pour une définition de type de document DTD entièrement analysée en XML (image)

2. Explication détaillée de la DTD
1 Explication détaillée des exemples

<?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?>     
<!-- 声明内部DTD -->     
<!DOCTYPE 影片目录[     
       <!ELEMENT 影片目录 (影片)+>   <!-- 声明XML顶层元素的子元素“影片”,“+”表示有一个或多个影片子元素 -->     
       <!ELEMENT 影片 (片名,主演,导演,简介)>     <!-- 声明“影片”元素的子元素 -->     
       <!ATTLIST 影片 类别 CDATA "动作" 年份 CDATA #REQUIRED> <!-- 声明“影片”元素的属性,两属性分别为“类别”和“年份”,CDATA说明属性的类型为字符型 -->     
       <!ENTITY 十面埋伏 "漫天大雪,三人在雪中决斗">   <!-- 实体的声明,类型为字符型,在下面使用“&实体名称;”直接引用 -->     
       <!ENTITY 霍元甲 "民族英雄,与西方帝国主义抗争">     
       <!ELEMENT 片名 (#PCDATA)>     
       <!ELEMENT 主演 (#PCDATA)>     
       <!ELEMENT 导演 (#PCDATA)>     
       <!ELEMENT 简介 (#PCDATA)>     
]>     
<!-- 由DTD获得的XML -->     
<影片目录>     
   <影片 类别="武侠" 年份="2008">     
         <片名>十面埋伏</片名>     
         <主演>刘德华、金城武、章子怡</主演>     
         <导演>张艺谋</导演>     
         <简介>&十面埋伏;</简介>     
   </影片>     
   <影片 类别="武侠" 年份="2006">     
       <片名>霍元甲</片名>     
       <主演>李连杰</主演>     
       <导演>于仁泰</导演>     
       <简介>&霍元甲;</简介>     
   </影片>     
</影片目录>

1.1 Déclaration de départ de la DTD.

(1) Déclaration interne : a4ecbb7fde390051c3588c36a667e00c
(2) Déclaration externe : 1d7f605dde39c8dc5f26405056b84aab
Il existe de nombreux formulaires de déclarations externes, principalement divisés en fichiers de type SYSTEM et PUBLIC.
SYSTEM : une DTD commune parmi de nombreux documents XML écrits par un auteur ou une organisation
PUBLIC : une DTD développée par une organisation faisant autorité et fournie pour des industries spécifiques ou un usage public ;
1.2 AutreDéclaration
(1) Élément :

<!ELEMENT element_name element_definition>

(2) Liste d'attributs :

<!ATTLIST Element_Name   
   Attribute_Name Type [added_declare]   
   Attribute_Name Type [added_declare]   
   ......   
>

(3) Entité
Interne
Général : 534814d417f2ecbde76607f0b029c013
Paramètres : f50c8f35ecb51bdf002872a9f40000e9
Externe
Général : 2c8ea6d697c9858257884283bdb819dc
Paramètres : < ;!ENTITY % Entity_Name SYSTEM Entity_URL>

2. Contenu détaillé
2.1 Déclaration d'élément
Exemple de code pour une définition de type de document DTD entièrement analysée en XML (image)

Les principales choses à prendre en compte dans la déclaration d'élément Il s'agit de plusieurs déclarations d'éléments spéciaux et du nombre d'occurrences de sous-éléments, de sélectivité et de types mixtes. Leurs fonctions sont similaires aux opérateurs arithmétiques et logiques dans les langages de programmation. Ce qui suit est un exemple de DTD avec plusieurs éléments.

<?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?>     
<!DOCTYPE 影片目录 [     
    <!ELEMENT 影片目录 (影片,其它,说明)+>   <!-- 使用“+”号表明影片目录中的子元素出现至少一次 -->     
    <!ELEMENT 其它 EMPTY>   <!-- 使用EMPTY关键字声明空元素 -->     
    <!ELEMENT 说明 ANY>     <!-- 使用ANY关键字声明任何内容的元素 -->     
    <!ELEMENT 影片(片名,主演,导演,简介)>    <!-- 含有子元素的元素声明格式 -->      
    <!ATTLIST 影片      
                    名称 ID #FIXED "十面埋伏"     
                    类别 CDATA "动作"      
                    年份 CDATA #REQUIRED     
                    票房 CDATA #IMPLIED     
     
    >    <!-- 属性声明 -->     
    <!ENTITY introduction "漫天大雪,三人在雪中决斗">     
    <!ELEMENT 片名(#PCDATA)>     
    <!ELEMENT 主演(#PCDATA)>     
    <!ELEMENT 导演(#PCDATA)>     
    <!ELEMENT 简介(#PCDATA)>     
]>

Pour une compréhension plus approfondie de la syntaxe de base des déclarations d'éléments, téléchargez cette carte.
2.2 Conflit de nom

Parfois, des éléments portant le même nom apparaissent dans un document XML complexe. Afin d'éviter ce phénomène, l' espace de noms et l'identifiant du préfixe.
2.2.1 Espace de noms
Utilisez xmlns pour introduire l'espace de noms et indiquer à l'utilisateur quelle partie appartient à l'espace. En termes de fonction, il est quelque peu similaire aux espaces de noms d'autres langages de programmation, garantissant l'unicité des éléments et évitant les conflits.

<?xml version="1.0" encoding=&#39;utf-8&#39;?>     
<影片 xmlns:h=&#39;http://www.abc.edu&#39; xmlns:c=&#39;http://www.123.edu&#39;><!-- 使用xmlns:来引用命名空间 -->     
  <db>     
    <h:table>werer</h:table>    <!-- 告诉用户,此table是在http://www.abc.edu中定义的 -->     
    <c:table>fdfdsfsdf</c:table>    <!-- 告诉用户,此table是在http://www.123.edu中定义的 -->     
  </db>     
</影片>

Fonction : Standardiser les éléments et les attributs et leur attribuer des identifiants uniques ; garantir qu'il n'y a pas de conflits dans les noms d'éléments et clarifier leurs origines.
2.2.2 Identificateur de préfixe
Ajoutez un identifiant avant le nom de l'élément et le nom de l'attribut pour distinguer de manière unique de quelle DTD provient l'élément ou l'attribut actuel. Il est souvent utilisé en conjonction avec des espaces de noms, comme. dans l'exemple ci-dessus fae077d51b591786197c1ce2523c9adb et 5627e76a423389c2e942bee17e543bf4.

3. Explication détaillée des entités

Pourquoi devons-nous introduire des entités lorsque nous avons des éléments ? Pour faire la distinction entre les deux, nous devons d’abord examiner le but de l’introduction d’une entité. Le mécanisme d'entité est un énorme outil permettant de gagner du temps pour incorporer de nombreux types de données différents dans des documents XML. C'est comme une classe abstraite orientée objet, résumant les objets fréquemment utilisés dans une entité, qui peut être directement référencée partout où elle est utilisée, évitant ainsi la duplication.
En détail,
(1) remplace les caractères qui ne peuvent pas être saisis. Le clavier ne contient que 26 lettres et quelques signes de ponctuation simples, et il existe de nombreux symboles différents dans le jeu de caractères qui ne peuvent pas être saisis. saisi. Saisi au clavier.
(2) Remplacez certains contenus qui entrent en conflit avec les mots réservés de la spécification XML, tels que : < et ainsi de suite.
(3) Remplacez les gros paragraphes de texte répété.
Les références d'entité sont divisées en deux types : internes et externes selon l'emplacement de la référence, et les références générales et paramètres selon le contenu de la référence. Regardons un exemple de référence d'entité externe :

Listing 1 : Déclaration de "2.dtd"

<!-- 声明外部DTD,并保存为2.dtd -->     
      
<!ELEMENT 影片目录 (影片)+>     
<!ELEMENT 影片 (片名,主演,导演,简介)>     
<!ATTLIST 影片 类别 CDATA "动作" 年份 CDATA #REQUIRED>     
<!ENTITY 十面埋伏 "漫天大雪,三人在雪中决斗">     
<!ENTITY 霍元甲 "民族英雄,与西方帝国主义抗争">     
<!ELEMENT 片名 (#PCDATA)>     
<!ELEMENT 主演 (#PCDATA)>     
<!ELEMENT 导演 (#PCDATA)>     
<!ELEMENT 简介 (#PCDATA)>     
<!ENTITY filmcomment SYSTEM "影评.xml">       <!-- 引用外部通用实体,文件名称为“影评.xml” -->

Listing 2 : Critique de film Contenu .xml

<?xml version="1.0" encoding=&#39;utf-8&#39;?>     
<影评>     
 这些影评都是由XXX公司出品,值得观看!     
</影评>

Listing 3 : Contenu dans un fichier XML utilisant dtd.

<?xml version="1.0" encoding=&#39;utf-8&#39;?>     
<影评>     
 这些影评都是由XXX公司出品,值得观看!     
</影评>


Listing 3 : Contenu du fichier XML utilisant dtd.

<?xml version="1.0" encoding=&#39;utf-8&#39;?>     
<!DOCTYPE 影片目录 SYSTEM "./2.dtd" >     
<影片目录>     
    <影片 类别="武侠" 年份="2008">     
        <片名>十面埋伏</片名>     
        <主演>刘德华、金城武、章子怡</主演>     
        <导演>张艺谋</导演>     
        <简介>&十面埋伏;</简介>     
    </影片>     
    <影片 类别="武侠" 年份="2006">     
        <片名>霍元甲</片名>     
        <主演>李连杰</主演>     
        <导演>于仁泰</导演>     
        <简介>&霍元甲;</简介>     
    </影片>     
     &filmcomment;     
</影片目录>


Listing 4 : Contenu après ouverture du Listing 3 avec IE8

<?xml version="1.0" encoding="utf-8" ?>     
  <!DOCTYPE 影片目录 (View Source for full doctype...)>     
- <影片目录>     
-   <影片 类别="武侠" 年份="2008">     
       <片名>十面埋伏</片名>     
       <主演>刘德华、金城武、章子怡</主演>     
       <导演>张艺谋</导演>     
       <简介>漫天大雪,三人在雪中决斗</简介>     
    </影片>     
-   <影片 类别="武侠" 年份="2006">     
       <片名>霍元甲</片名>     
       <主演>李连杰</主演>     
       <导演>于仁泰</导演>     
       <简介>民族英雄,与西方帝国主义抗争</简介>     
    </影片>     
    <影评>这些影评都是由XXX公司出品,值得观看!</影评>     
  </影片目录>

内部和外部很容易理解,主要看一般和参数两种引用的区别。

1.参数实体

清单1:test.dtd,在此该内容单独存在了一个dtd文件中是因为在内部DTD子集中。
参数实体引用不能在标记声明内部出现,可以在标记声明允许出现的地方出现。然而,对于外部DTD子集,则没有这个限制。

<!-- 声明外部DTD,并保存为test.dtd -->     
<!-- 个人信息实体声明的是参数类型的,可以再各个元素中共同使用该参数 -->     
<!ENTITY % 个人信息 "(姓名,性别,出生日期)">     
<!ELEMENT 学生信息 %个人信息;>     
<!ELEMENT 教师信息 %个人信息;>     
<!ELEMENT 员工信息 %个人信息;>


清单2:学校信息.xml文件,引用了外部的test.dtd文件

<?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?>     
<!-- 学校信息.xml文件 -->      
<!-- 引用外部DTD -->     
<!DOCTYPE 学校信息 SYSTEM &#39;./test.dtd&#39;>     
<!-- 由DTD获得的XML -->     
<学校信息>     
 <学生信息>     
  <姓名>张三</姓名>     
  <性别>男</性别>     
  <出生日期>2013-10-12</出生日期>     
 </学生信息>     
 <教师信息>     
  <姓名>张三</姓名>     
  <性别>男</性别>     
  <出生日期>2013-10-12</出生日期>     
 </教师信息>     
 <员工信息>     
  <姓名>张三</姓名>     
  <性别>男</性别>     
  <出生日期>2013-10-12</出生日期>     
 </员工信息>     
</学校信息>

       
清单3:使用IE8打开清单2的内容后

<?xml version="1.0" encoding="utf-8" ?>     
- <!--   
 声明内部DTD    
  -->     
  <!DOCTYPE 学校信息 (View Source for full doctype...)>     
- <!--   
 由DTD获得的XML    
  -->     
- <学校信息>     
-    <学生信息>     
       <姓名>张三</姓名>     
       <性别>男</性别>     
       <出生日期>2013-10-12</出生日期>     
     </学生信息>     
-    <教师信息>     
        <姓名>张三</姓名>     
        <性别>男</性别>     
        <出生日期>2013-10-12</出生日期>     
     </教师信息>     
-    <员工信息>     
        <姓名>张三</姓名>     
        <性别>男</性别>     
        <出生日期>2013-10-12</出生日期>     
     </员工信息>     
  </学校信息>

 
2. 一般实体

可在XML元素中加以引用,也可以在DTD中引用,但参数实体只能在DTD中引用,并且通常情况下只能在外部DTD文档中引用。

3. 对比升华

参数实体与一般实体的区别如下:

     (l)在定义参数实体时,实体名前必须加一个“%”号。

     (2)参数实体引用以“%”开始,而不是一般实体引用的“&”。

     (3)参数实体的内容不仅可以包含文本,还可以包含标记。

     (4)参数实体只能应用于DTD,而不能在文档本体中引用。即参数实体只能用来构成DTD的内容,而不能构成文档内容。

     (5)参数实体只能在外部DTD文档中使用,无法应用于内部DTD。


外部参数实体与外部一般实体的区别如下:

     (1)外部参数实体应用于独立的DTD文档,外部一般实体应用于XML文档。

     (2)外部参数实体应用于将多个独立的DTD文档组合为一个大的DTD文档,外部一般实体用于将多个独立的XML文档组合成一个大的XML文档。


四、验证XML文件的合法性

DTD定义了XML文件的使用格式,它从结构和形式上限制了XML文档,通过引用DTD可以形成统一的规范化的XML文档,另外通过使用实体简化了DTD和XML文档的内容。使用DTD验证的XML文档才能称为规范化文档,那如何验证所写的XML文档是否符合DTD的规范呢。通过如下的代码串:

import javax.xml.parsers.DocumentBuilder;     
import javax.xml.parsers.DocumentBuilderFactory;     
     
import org.xml.sax.InputSource;     
     
public class ValidateDTD     
{     
    public static void main(String[] args){     
             
        //在验证前需要把需要验证的XML和规范DTD包含在jar中     
        try{     
            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();    //创建一个文档构造工厂     
            dbf.setValidating(true);     
            DocumentBuilder builder=dbf.newDocumentBuilder();     
            builder.parse(new InputSource("xml-2-2.xml"));  //需要验证的XML名称     
        }catch(Exception e){     
            e.printStackTrace();     
        }     
    }     
}

上面代码中的类和结构主要完成了XML文档的解析,并且在解析之前验证当前XML文件是否符合某个DTD的定义。在上面的代码运行前需要将需要验证的XML和提供规范化的DTD文档引入到当前ValidateDTD项目中,后运行上面的代码实例,该项目会在项目文件中自动查找规范的DTD,然后验证xml文件。

五、结语
至此,有关文件定义格式的内容已经基本上讨论了一遍,从最初的元素声明到复杂多变的实体类型,DTD的引入无疑为XML的使用指定了一个统一的标准,这种标准是由提供方规定好,使用方遵守的一种规则,并在最后讨论了如何验证引用DTD的XML合法与否。另外描述XML文档结构的不仅仅只有DTD,DTD是一种早期的定义格式,它有很多缺点,如不支持数据类型,不易于扩展等,为了避免这种缺点后来又引入了Schema,它是DTD的继任者,下篇博客将着重讨论Schema。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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