无废话XML--XML约束(DTD)

  • 基本术语
    一、序言Prolog:包括XML声明(XML Declaration)和文档类型声明(Document Type Declaration)。
    二、良构(well-formed 规范的):符合W3C定义的XML文档。
  

  • 为什么XML需要验证?  

 对XML文件施加额外的约束,以便交流。举个例子:要是我和你在交互一份数据,那么按照我的主管意识我可能会这样子定义,按照你的主观意识你可能会那样子定义,那么我们之间要怎么交互数据呢?没有一个提前规定号的约定来规范我们如何写XML,那么就连这份XML的解析估计都是问题了吧,那还交互个毛线呀。

XML有2种约束:1,DTD     2,schema。


  • DTD验证
    文档类型定义(Document Type Definition)。    DTD定义了XML文档内容的结构,保证XML以一致的格式存储数据。精确的定义词汇表,对XML的内容施加约束。    符合DTD的规范XML文档称为有效的文档。由DTD定义的词汇表以及文档语法,XML解析器可以检查XML文档内容的有效性。    规范的XML文件不一定是有效的;有效的一定是规范的。


1、 DTD声明
    1) DTD声明可以在单独的一个文件中
    2) DTD声明可以内嵌在XML文件中
    3) DTD声明可以一部分在单独的文件中,另一部分内嵌在XML文件中


2、 引入外部DTD文件。DOCTYPE有2种情况:

1),当引用的文件在本地时:

     <!DOCTYPE 根节点名称 SYSTEM "dtd文件路径">

2),当引用的文件是一个公共的文件时:实际中这种情况比较多见的。

<!DOCTYPE 根节点名称 public "DTD名称" "DTD文件的URL">

比如我们在写一个JSP,前面都有这个文档定义的。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


3、 DTD四种标记声明    元素(ELEMENT)、属性(ATTLIST)、实体(ENTITY)、符号(NOTATION)

  1) 元素(ELEMENT) XML元素类型声明
     声明元素: <!ELEMENT elementName (contentModel)>
     元素的内容通过内容模式来描述。
     DTD 内容模式的种类有:
         EMPTY   元素不能包含任何数据,但可以有属性(前提是必须声明其属性)。
                 不能有子元素。不能有文本数据(包括空白,换行符)。
                 DTD中定义: <!ELEMENT elementName EMPTY>
                 XML中:<elementName/>(推荐) 或者:<elementName></elementName>
       (#PCDATA) 规定元素只包含已析的字符数据,而不包含任何类型的子元素的内容类型。
                 DTD中定义: <!ELEMENT student (#PCDATA)>
                 XML中合法内容: <student>watching TV</student>
      (Elements) 元素由内容模式部件指定。
                 <!ELEMENT  name  (child particles) > 
                 内容模式部件可以是下表列出的内容。
                    <!ELEMENT name (a,b)>  子元素a、b必须出现,且按照列表的顺序
                    <!ELEMENT name (a|b)>  选择;子元素a、b只能出现一个
                    <!ELEMENT name (a)  >  子元素a只能且必须出现一次
                    <!ELEMENT name (a)+ >  子元素a出现一次或多次
                    <!ELEMENT name (a)* >  子元素a出现任意次(包括零次、一次及多次)
                    <!ELEMENT name (a)? >  子元素a出现一次或不出现
        Mixed    混合模式:子元素中既可有文本数据又可有下级子元素。
                 <!ELEMENT rn (#PCDATA| an | en)*>“|”和“*”必须写。
                 上句表示在 rn 内,字符数据 或 en及an 可以出现任意多次,顺序不限。
                 优先写(#PCDATA)  如:(#PCDATA|name)* 正确   (name|#PCDATA)* 错误
         ANY     元素可以包含任何类型的数据。子元素(必须在DTD中有定义) 和 文本数据(包括空白)。
                 DTD中定义: <!ELEMENT a ANY> <!ELEMENT b ANY>
                 XML中合法内容: <a>somngthing</a> 或者 <a/> 或者 <a><b>oo</b></a>

   2) 属性(ATTLIST) 特定元素类型可设置的属性&属性的允许值声明
        <!ATTLIST elementName
        attributeName1 attributeType attributeDefault
        .......
        attributeNameN attributeType attributeDefault>
     属性类型 (Attribute Type):
        CDATA该属性只能包含字符数据(注意与CDATA段、PCDATA的区别)
        NMTOKEN  是CDATA的子集,它的字符只能是字母,数字,句点,破折号,下划线或冒号。
        NMTOKENS 类似NMTOKEN,但这个可以包含多个值,每个值之间用空格隔开。
        ID       该属性的取值在同一文档内是唯一的。一个元素只能有一个ID类型的属性。
        IDREF    类似指针,指向文档中其他地方声明的ID值。如果该属性取值和指向的ID值不匹配,则返回错误。
        IDREFS   类似IDREF,但它可以具有由空格分隔开的多个引用。
        ENTITY   该属性的值必须对应一个在文档内部声明的但还没有分析过的实体。
        ENTITYS  类似ENTITY,但它可以包含由空格分隔开的多个实体。
        NOTATION 该属性的值必须引用在文档中其他地方声明的某个注释的名称。
        (enumerated) 类似枚举的变量,该属性必须匹配所列的值。各值用“|”分隔开。
                 如: (春|夏|秋|冬) 实际内容文档只能从中取一个。
     属性特性 (Attribute Default) :
        #REQUIRED   必须有且只能有一个属性。
        #IMPLIED    可有可无。
        #FIXED      在DTD中定义默认值,XML中可以不指定,指定则必须等于该默认值。
        attribute-value 如果不指定则用DTD定义的默认值,指定则用指定的值。


<![CDATA[############ 属性(ATTLIST)的举例 ############## ]]>
例一(#REQUIRED)
    DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at1 NMTOKENS #REQUIRED  at2 CDATA #REQUIRED>
    XML中,正确: <el at1 = "10 20"   at2="10" >something</el>
    XML中,错误: <el at="10">something</el>  (没有写另一个#REQUIRED的属性 at2 )


例二(#IMPLIED,#FIXED)
    DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA #FIXED "10"  at2 CDATA #IMPLIED >
    XML中,正确: <el   at2="20" >something</el> (at有默认值"10",at2 可写可不写)
    XML中,错误: <el at="11" >something</el>(at要么不写,要写只能写成跟默认值相同的)


例三(attribute-value)
    DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA "10" at2 CDATA "20" >
    XML中,正确: <el at="11" >something</el>


例四(enumerated + attribute-value)
    DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at (10|20|30) "10">
    XML中,正确: <el at="20">something</el>  (at要么不写,默认值 10;要么在(10|20|30)中选一个写)
<![CDATA[############ 属性(ATTLIST)举例 完毕 ############## ]]>


  3) 实体(ENTITY)   可重用的内容声明
     在DTD中定义 <!ENTITY 实体标志 "实体内容">
     在xml中引用自定义的实体,用  &实体标志;  代表实体内容。
      4) 符号(NOTATION) 不要解析的外部内容的格式声明。
     
3、 内部实体:在xml文件里面写(少用)。    外部实体:另外在xml同一文件夹下建立一个dtd文件(提倡)

外部的:以下是XML:
     
 <?xml  version="1.0"  encoding="UTF-8" standalone="no"?><!DOCTYPE root SYSTEM "goodsInfo.dtd"><!--用这句引用外部dtd--><root><goodsInfo><goodsName>goodsName</goodsName><goodsPrice>goodsPrice</goodsPrice></goodsInfo></root>
      以下是名为"goodsInfo.dtd"文件:
     
 <!ELEMENT root   (goodsInfo)><!ELEMENT goodsInfo  (goodsName,goodsPrice)><!ELEMENT goodsName  (#PCDATA)><!ELEMENT goodsPrice (#PCDATA)>

内部的:
     
 <?xml  version="1.0"?><!DOCTYPE root [<!ELEMENT root(student)><!ELEMENT student (#PCDATA)><!ENTITY CCTV  "中央电视台">]>  <!--把DTD文件写在体内--><root><student>student watch &CCTV;<!--使用自定义实体 CCTV--></student></root>

转载于:https://www.cnblogs.com/LinkinPark/p/5233115.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 流,字节数组及字符串之间的转换

//1.流转换为字节数组&#xff0c;fileUpload为.net上传控件Stream stream fileUpload.FileContent;byte[] fileBuffer new byte[stream.Length];stream.Read(fileBuffer,0,(int)stream.Length);//2.字节数组转换为字符串string fileBody System.Text.Encoding.Default.GetS…

mysql周报内容范文_Mysql各种报表查询含实例,日报,周报,月报,时间差自动计算...

public List retrieve(IReport report) {List list new ArrayList();Map map new HashMap();// 设置结束日期if (null ! report.getEndTime()) {map.put(ReportMeta.PROP_ENDTIME, report.getEndTime());// 设置名称if (null ! report.getName()) {map.put(ReportMeta.PROP_N…

路由器01---k2刷Pandora

1.固件 固件(Firmware)就是写入EPROM&#xff08;可擦写可编程只读存储器&#xff09;或EEPROM(电可擦可编程只读存储器)中的程序。 对于独立可操作的电子产品&#xff0c;固件一般指它的操作系统&#xff08;“担任着一个数码产品最基础、最底层工作的软件才可以称之为固件”&…

windows mac 安装lua

mac从源码编译安装是最方便的&#xff0c;lua源码不足两万行&#xff0c;编译几秒钟的事。 打开terminal&#xff0c;依次输入以下命令&#xff1a; curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.gz tar zxf lua-5.2.3.tar.gz cd lua-5.2.3 make macosx test sudo make in…

python中squeeze函数_详解pytorch中squeeze()和unsqueeze()函数介绍

squeeze的用法主要就是对数据的维度进行压缩或者解压。先看torch.squeeze() 这个函数主要对数据的维度进行压缩&#xff0c;去掉维数为1的的维度&#xff0c;比如是一行或者一列这种&#xff0c;一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。squeeze(a)就是…

新闻网大数据实时分析可视化系统项目——7、Kafka分布式集群部署

Kafka是由LinkedIn开发的一个分布式的消息系统&#xff0c;使用Scala编写&#xff0c;它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与Kafka集成。 1.下载Kafka并安装 1&#xff09;下载Apache版本的Kafka。 …

关于Excel导入的问题记录

当Excel导入成为需要时&#xff0c;之前的导出Excel为html方式的方法就受阻了&#xff0c;于是&#xff0c;需要开始新的百度与google来解决问题。 前提为OLEDBExcel。 根据需求&#xff0c;多数是对于表的数据的导入。于是产生这么一个需求过程&#xff1a; 1。准备一个空的标…

vux 地图插件_基于vue的移动端组件vux的安装及使用

一、安装<1>. 在项目里安装vuxnpm install vux --save<2>. 安装vux-loader (这个vux文档似乎没介绍&#xff0c;当初没安装结果报了一堆错误)npm install vux-loader --save-dev<3>. 安装less-loader (这个是用以正确编译less源码&#xff0c;否则会出现 Ca…

代码优化

代码优化 并非所有的处理器级优化策略仅限于汇编。即使C这样的高级语言中&#xff0c;也由不少适用的规则。 减少上下文依赖 看如下程序&#xff1a; double list[100]; double sum 0; for (int i 0; i < 100; i) {sum list[i]; } 上面这段代码还可以优化吗&#xff1f;站…

3.3.10 动态SQL

十、动态SQL 根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL. 1. <if> 用于进行条件判断, test 属性用于指定判断条件. 为了拼接条件, 在 SQL 语句后强行添加 11 的恒成立条件. <select id"sel" resultType"…

无法载入 mysql 扩展

今天弄了一天&#xff0c;总算把win2003下的问题给解决了&#xff0c; LoadModule php5_module E:\server\php528\php5apache2_2.dll 可能有些朋友也知道&#xff0c;添加这句后&#xff0c;就不用把php.ini拷贝到系统目录&#xff1a; PHPIniDir E:\server\php528\php.ini 现在…

订阅mysql的二进制日志_MySQL二进制日志

一、二进制日志(The Binary Log)1、简介包含所有更新了的数据或者已经潜在更新了的数据(比如一条没有匹配任何行的delete语句)包含所有更新语句执行时间的信息不记录没有修改数据的语句例如select&#xff0c;show主要作用一&#xff1a;主从复制主要作用二&#xff1a;恢复数据…

AIX-vi操作-提示Unknown terminal type的问题解决方法

AIX-vi操作-提示Unknown terminal type的问题解决方法AIX Version 5.3$ vi /etc/profilelinux: Unknown terminal type[Hit return to continue] :q!I dont know what kind of terminal you are on - all I have is linux.[Using open mode]……临时办法&#xff0c;下次启动失…

javaEE jdbc编程步骤

版权声明&#xff1a;本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/qilixiang012/article/details/25925647 1.载入数据库驱动(jar文件) //须要下载一个数据库的jar包&#xff0c;并导入对应的JDBC项目中。创建路径&#xff01; Class.forName("co…

【备忘】XP欢迎页中隐藏用户名

HKEY_LOCAL_MACHINESoftware\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList 适用范围&#xff1a;Windows XP默认情况下&#xff0c;Windows XP会在登录界面中显示已经建立的用户账户名称。这样将方便恶意者猜测用户口令而进入系统&#xff0c;以下设…

centos镜像 from_【CentOS 7.1】使用163的镜像

CentOS 7.1.1503// backup[rootlocalhost yum.repos.d]# cd /etc/yum.repos.d/[rootlocalhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bakmv: overwrite ‘CentOS-Base.repo.bak‘? y[rootlocalhost yum.repos.d]#// wget[rootlocalhost yum.repos.d]# wget htt…

Java性能调优工具

2019独角兽企业重金招聘Python工程师标准>>> 1、JDK命令行工具 1.1、jps命令 jps用于列出Java的进程&#xff0c;jps可以增加参数&#xff0c;-m用于输出传递给Java进程的参数&#xff0c;…

转载:如何在 SQL Server 中使用配置选项调整内存使用量

查看( 4 ) / 评论( 0 ) / 评分( 0 / 0 ) 以前做过一个通过c#调用Excel组件生成Excel的小程序前几天PM打过电话来问, 说跑完以后为什么SQL Server内存占用这么大?服务器配置2G的内存, 程序正常执行完毕以后退出, SQL Server占用内存在1.7G, 而且没有被释放.因为怕可能会影响这个…

hive sql 报错后继续执行_Hive 执行sql命令报错

Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D执行 show tables&#xff1b;出现上面的错误。错误原因修改 hive-site.xml 文件中的配置出现问题。# 编…

为什么要那么努力?

只是想着让我们前进的速度超过父母老去的速度。加油&#xff01;每个人的人生都不一样&#xff0c;做不一样的自己。元旦了&#xff0c;回家。转载于:https://www.cnblogs.com/kirinchang/p/4190103.html