XML——文档类型定义(DTD-Document Type Definition)

【0】README

0.1)本文文字描述转自 core java volume 2 , 旨在理解 XML——文档类型定义(DTD-Document Type Definition) 的基础知识;
0.2) for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter2/ParseXMLTest.java
0.3) 为什么使用 DTD: 参见 http://blog.csdn.net/pacosonswjtu/article/details/50588471


【1】DTD相关

1)提供DTD的方式有多种,可以将其纳入到 XML文档中:

<?xml version="1.0">
<!DOCTYPE configuration [<!ELEMENT configuration ...>more rules...
]>

2)正如你所看到的,这些规则被纳入到了 DOCTYPE声明中, 该代码块使用 […] 来限定其界限;文档类型必须匹配根元素的名字,比如 荔枝中的configuration;
3)在XML 文档内部使用 DTD 不是很普遍,因为DTD会使文件长度变得很长,把DTD存储在外面更具有意义; (干货——在XML 文档内部使用 DTD 不是很普遍,因为DTD会使文件长度变得很长,把DTD存储在外面,这也是引入SYSTEM声明的原因)

  • 3.1)SYSTEM声明可以用来实现这个目标,你可以指定一个包含DTD的URL,如:
<!DOCTYPE configuration SYSTEM "config.dtd">或者:
<!DOCTYPE configuration SYSTEM "http://myserver.com/config.dtd">
  • Warning)
    • w1)如果你使用 的是 DTD 的相对URL(比如 config.dtd),那么要给解析器一个 File 或 URL 对象,而不是 InputStream;(干货——如果使用相对URL定位DTD)
    • w2)如果必须从一个输入流来解析,请提供一个实体解析器;

4)最后,有一个来源于 SGML 的用于识别DTD的机制:

<!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2 //EN""http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">

Attention)

  • A1)如果你使用的是DOM 解析器, 并且想支持 PUBLIC标识符,请调用 DocumentBuilder 类的 setEntityResolver 方法来安装 EntityResolver 接口的某个实现类的一个对象。该接口只有一个方法:resolveEntity;
  • A2) 下面是一个典型实现的代码框架:
class MyEntityResolver implements EntityResolver
{public InputSource resolveEntity(String publicId, String systemId){if(publicId.equals(a  known Id))return new InputSource(DTD data);elseretunr null;}
}
你可以从 InputStream, Reader 或字符串构建输入源;

5) 现在你知道了 解析器怎样定位 DTD了,下面,看看不同类型的规则:

  • 5.1)ELEMENT 规则:用于指定某个 元素可以拥有什么样的子元素;可以指定一个正则表达式,如下表所示: (干货——ELEMENT 规则和正则表达式结合起来)
    这里写图片描述

  • 5.2) 下面是一些简单而典型的荔枝。 下面的规则声明了 menu 元素包含0个或多个item 元素:

<!ELEMENT font (name, size)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT size (#PCDATA)>

Attention)

  • A1) PCDATA = parsed char data, 表示已解析的字符数据; (干货——PCDATA定义 not CDATA 定义)
  • A2)数据是已解析的,因为 解析器通过寻找表示一个新标签起始的 < 字符或 表示一个实体起始的 & 字符, 而解释了这些文本字符串;

  • 5.4) 元素的规格说明可以包含 嵌套的和复制的正则表达式, 如, 下面是一个描述了本书中每一章的结构的规则: (干货——元素的规格说明可以包含 嵌套的和复制的正则表达式)

<!ELEMENT chapter (intro,(heading,(para|image|table|noe)+)+)>
每章都以简洁开头, 其后是一个或多个小节, 每个小节有一个标题和一个或多个段落,图片,表格或说明构成;
  • 5.5)有一种常见的case 是: 不能把规则定义得像你希望的那样灵活。当一个元素可以包含文本时,那么就只有两种合法的cases:
    • case1)要么元素只包含文本, 比如 <!ELEMENT name (#PCDATA)>
    • case2)要么元素只包含任意顺序的文本和标签的组合, 比如 <!ELEMENT para (#PCDATA|em|strong|code)*>
  • 5.6)指定其他包含 #PCDATA 规则的类型都是不合法的。如,以下规则是非法的:
<!ELEMENT captionedImage (image, #PCDATA)> , 必须重写一个规则,以引入另一个 caption 元素或 允许 使用 image 元素或文本的组合;
  • 5.6.1)这种限制简化了XML 解析器在解析混合式内容(标签和文本的混合)时的工作。因为在允许混合式内容时难免失控, 所以最好在设计 dtd时, 让其中所有的元素要么包含 其中元素,要么只包含文本;
  • 5.7) 还可以指定描述合法的元素属性的规则, 通用语法为: (干货——还可以指定描述合法的元素属性的规则)
    <!ATTLIST element attribute type default>

  • 5.7.1)下面是两个典型的属性规格说明:

<!ATTLIST font style (plain|bold|italic|bold-italic) "plain">
<!ATTLIST size unit CDATA #IMPLIED>
  • 对上述规格的分析(Analysis):

    • A1)第一个规格说明: 描述了font元素的style 属性, 它有4个合法的属性值, 默认值是 plain;
    • A2)第二个规则说明: 表示 size 元素的unit 属性 可以包含任意字符数据序列;
  • 5.8) 表2-2 显示了合法的属性类型, 表2-3 显示了属性默认值 的语法: (干货——CDATA定义)
    这里写图片描述

Attention)

  • A1)一般情况下,我们推荐用元素而非属性来描述数据;
  • A2)属性有一个不可否认的优点: 那就是解析器能够校验取值是否合法,

6)CDATA属性值的处理与你前面看到的处理 #PCDATA有着微妙的差别: 并且与 < ![CDATA[...]]> 部分没有多大关系。 属性值首先被规范化, 也就是说, 解析器要处理对字符和实体的引用, 并且要用空格来替换空白字符;

  • 6.1)NMTOKEN(即名字标记)与 CDATA相似: 但是大多数非字母数字字符和内部的空白字符是不允许使用的, 而且解析器会删除起始和结尾的空白字符。NMTOKENS 是一个以空白字符分隔的名字标记列表;
  • 6.2) 属性类型介绍:
    • 6.2.1)ID: ID 结构是有用的, ID 是在文档中唯一的名字标记,解析器会检查其唯一性;
    • 6.2.2)IDREF: IDREF 是对同一个文档中 已存在的ID的应用;解析器也会对它进行检查;
    • 6.2.3)IDREFS: IDREFS 是以空白字符分割的 ID 引用的列表;
  • 6.3)ENTITY 属性值: 将引用一个 “未解析的外部实体”, 这是从 SGML将那里沿用下来的, 在实际应用中很少见;
  • 6.4)DTD 也可以定义实体,或定义解析过程中被替换的缩写。 (干货——DTD 也可以定义实体, 而其他地方的文本可以包含对这个实体的引用)
    • 6.4.1)看个荔枝:
<!ENTITY back.label "Back">
其他地方的文本可以包含对这个实体的引用,如: <menuitem label = "&back.label; "/>

7)Conclusion: 这样,我们就结束了对 DTD 的介绍了。你已经知道如何 使用 DTD了;你可以配置你的解析器以充分利用他们; (干货——如何配置XML解析器)

  • C1)首先,通知文档生成工程打开验证特性:
    factory.setValidating(true);
  • C2)这样, 该工厂生成的所有文档生成器都将根据DTD 来验证他们的输入。验证的最大好处是可以忽略元素内容的空白字符, 如,考虑如下代码:
<font><name>a</name><size>a</size>
</font>
  • C3)一个不进行验证的解析器会报告 font, name 和 size 元素之间的空白字符, 因为它无法知道 font 的子元素是: (name, size) (#PCDATA, name, size) * 还是 ANY
  • C4)一旦 DTD 指定了子元素是 (name, size), 解析器就知道他们之间的空白字符不是文本。调用下面的代码:
    factory.setIgnoringElementContentWhitespace(true); (干货——将dtd绑定到xml后,必须进行设置setIgnoringElementContentWhitespace)
    这样, 生成器就不会报告文本节点中的空白字符, 这意味着, 你可以依赖 font 节点只有2个子元素的事实。
  • C5)你只需要 通过如下代码访问第一个和第二个元素:
Element e1 = (Element) children.item(0);
Element e1 = (Element) children.item(1);

这里写图片描述
这里写图片描述

  • C6)这就是 DTD 如此有用的原因。 (干货——这就是 DTD 如此有用的原因)
  • C7) 当解析器报告错误的时候, 应用程序希望对该错误执行某些操作; (干货——当解析器报告错误的时候, 应用程序希望对该错误执行某些操作)
    • C7.1)在验证时, 应该安装一个 错误处理器,这需要提供一个实现了 ErrorHandler 接口的对象,这个接口有3个方法:
void warning(SAXParseException exception)
void error(SAXParseException exception)
void fatalError(SAXParseException exception)
可以通过 DocumentBuilder 类的  setErrorHandler 方法来安装 错误处理器:
builder.setErrorHandler(handler);

这里写图片描述

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

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

相关文章

职称计算机考试 数量,职称计算机考试WPS基础考点:自动求和

职称计算机考试WPS基础考点&#xff1a;自动求和导语&#xff1a;随着信息技术的发展&#xff0c;计算机日益走进人们的工作、学习和生活&#xff0c;成为专业技术人员不可或缺的工具。下面我们一起来看看职称计算机考试WPS的内容吧。1. 对不相邻单元格的数据求和假如要将单元格…

java静态导入

一、静态导入 在Java 5中&#xff0c;import语句得到了增强&#xff0c;以便提供甚至更加强大的减少击键次数功能&#xff0c;虽然一些人争议说这是以可读性为代价的。这种新的特性成为静态导入。当你想使用static成员时&#xff0c;可以使用静态导入&#xff08;在API中的类和…

java流写入数据库_成为Java流大师–第4部分:数据库流

java流写入数据库SQL一直是一种声明性语言&#xff0c;而Java长期以来势在必行。 Java流改变了游戏规则。 通过本动手文章编写您的方式&#xff0c;并学习如何使用Java流对RDBMS数据库执行声明性查询&#xff0c;而无需编写任何SQL代码。 您会发现&#xff0c;Java流和SQL命令的…

XML——XML Schema

【0】README 0.0&#xff09;本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——XML Schema 的基础知识 &#xff1b;&#xff08;本文不涉及源代码&#xff0c; 很遗憾&#xff0c;以后会补充&#xff09; 【1】XML Schema 相关 1.0&#xff09;为什么引入…

怎么为pdf文件添加水印?

怎么为pdf文件添加水印&#xff1f;PDF是一种很好用的文件格式&#xff0c;这种格式能够很有效的保护我们的文件&#xff0c;但有时可能还会被破解&#xff0c;这种时候在PDF上添加水印就是比较好的方法。 综上所述&#xff0c;PDF是保密性很强的文件&#xff0c;但添加水印能够…

皖西学院计算机协会组织部,皖西学院

皖西学院关于卢义忠同志兼任安徽省高校后勤协会理事的请示安徽省委组织部:根据《关于进一步规范党政机关和企事业单位领导干部兼任社会组织职务审批管理的通知》(皖组通字〔2016〕40号)等文件精神&#xff0c;经皖西学院党委1月17日研究建议&#xff1a;因校领导分工调整&#…

java 用流创建流_成为Java流大师–第1部分:创建流

java 用流创建流在许多情况下&#xff0c;声明性代码&#xff08;例如&#xff0c;具有Streams的功能组合&#xff09;提供了出色的代码指标。 通过该动手实验文章系列进行编码&#xff0c;并成为Java Streams的主教练&#xff0c;从而成为一名更好的Java程序员。 Streams的整…

java的for循环

一、普通for循环&#xff08;1&#xff09;for循环语法 for&#xff08;initialization; condition; update&#xff09;{statements;} &#xff08;2&#xff09;语法解释 1、for语句执行时&#xff0c;首先执行初始化操作&#xff08;initialization&#xff09;&#xff0c…

XML——使用 XPath来定位信息+使用命名空间

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——使用 XPath来定位信息使用命名空间 的基础知识 &#xff1b; 0.2&#xff09; for detailed XPath info &#xff1a; please visit ( http://www.ruanyifeng.com/blog/2009/…

计算机教室英语怎么读音,网络教室,network classroom,音标,读音,翻译,英文例句,英语词典...

多媒体教室1.多媒体教室基本组成多媒体教室由多媒体计算机、液晶投影机、数字视频展示台、中央控制系统、投影屏幕、音响设备等多种现代教学设备组成。(1)多媒体液晶投影机是整个多媒体演示教室中最重要的也是最昂贵的设备&#xff0c;它连接着计算机系统、所有视频输出系统及数…

算法一之简单选择排序

一、 选择排序的思想 选择排序的基本思想是&#xff1a;每一趟在n-i1&#xff08;i1&#xff0c;2&#xff0c;…n-1&#xff09;个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。简单选择排序的基本思想&a…

XML——流机制解析器

【0】README 0.1&#xff09; 本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——流机制解析器 的基础知识 &#xff1b; 0.2&#xff09; for detailed StAX, please visit http://blog.csdn.net/pacosonswjtu/article/details/50569728 【1】XML——流机制…

第512章 河系量子计算机,第512章、河系量子计算机

69中文网 www.69zww.cc&#xff0c;最快更新分身投胎万界最新章节&#xff01;但AI智能所容身的量子计算机就大得有些恐怖了。其总体积丝毫不亚于一个小型河系&#xff01;什么是河系&#xff1f;银河系&#xff0c;仙女星系等等都是大小不等的河系&#xff01;而AI智能容身的量…

idea内置junit5_JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

idea内置junit5Selenium是一组支持浏览器自动化的工具和库&#xff0c;主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver&#xff0c;它提供客户端库&#xff0c;JSON有线协议&#xff08;与浏览器驱动程序进行通信的协议&#xff09;和浏览器驱动程序。 Sel…

算法二之树形选择排序

一、树形选择排序的基本思想 &#xff08;1&#xff09; 树形选择排序又称锦标赛排序&#xff08;Tournament Sort&#xff09;&#xff0c;是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的关键字进行两两比较&#xff0c;然后在n/2个较小者之间再进行两两比较&am…

计算机声卡型号价格,怎么查看电脑的声卡型号?查看声卡型号方法介绍

声卡是电脑上的硬件设施&#xff0c;任何电脑上的硬件都需要使用驱动使其运行&#xff0c;那么我们下载驱动的时候就会用到声卡型号&#xff0c;那么怎么查看电脑的声卡型号?下面小编就为大家详细介绍一下&#xff0c;一起来看看吧&#xff01;使用命令查看1、首先呢&#xff…

spring 配置只读事务_只读副本和Spring Data第1部分:配置数据库

spring 配置只读事务这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目&#xff0c;我们的目标是建立我们的spring数据应用程序&#xff0c;并使用read仓库进行写操作&#xff0c;并基于read副本进行读操作。 为了模拟这种环境&#xff0c…

XML—— XSL 转换

【0】README 0.1&#xff09; 本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML—— XSL 转换 的基础知识 &#xff1b; 0.2&#xff09;XSL 转换&#xff1a; XSL 转换&#xff08;eXtensible StyleSheet Language扩展样式表语言&#xff09; (for detailed…

算法三之堆排序

一、堆(Heap)定义 &#xff08;1&#xff09;n个关键字序列Kl&#xff0c;K2&#xff0c;…&#xff0c;Kn称为&#xff08;Heap&#xff09;&#xff0c;当且仅当该序列满足如下性质&#xff08;简称为堆性质&#xff09;&#xff1a; k(i)<k(2i&#xff09;且k(i)<k(2i…

计算机宏如何设置方法,excel 如何启用宏的方法,以及如何设置excel启用宏

如何启用宏呢&#xff1f;在进行如何启用宏讲解之前&#xff0c;先来认识&#xff0c;Excel几个其余宏相关的知识点。如果Excel工作簿中包含宏&#xff0c;则将在打开工作簿之前对其进行扫描&#xff0c;以检查是否存在已知病毒。Excel宏设置有四个选项&#xff0c;如下图所示&…