ch2 XML

有两种XML文档结构,DTD和Schema,用解释文档构成规则,这些规则指定了每个元素俺的合法子元素和属性。

DTD

DTD有多种提供方式,可以像下面这样加到XML中:

<?xml version="1.0"?>

<!DOCTYPE configuration [    //文档类型必须匹配根元素的名字

  <!ELEMENT configuration ...>

  more rules

  ...

]>

<configuration>    //根元素

  ...

</configuration>

当然,直接在XML中提供DTD不常用,更常用的方式是DTD放在外面。用SYSTEM声明。

<!DOCTYPE configuration SYSTEM "config.dtd"> //相对于当前XML文档的路径,因为是相对路径,解析器要能够定位,要么是File或Url对象,要么是InputStream加实体解析器来定位。

<!DOCTYPE configuration SYSTEM "http://myserver.com/config.dtd">

还有一种所谓的“总所周知”的DTD机制:

<!DOCTYPE web-app

  public "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"   //publicId

  "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">  //systemId

如果解析器能定位public,就不需要http那段了

然后书中给了一段代码和一句洋文翻译过来的话,“如果你使用的是DOM解析器,并且想要支持PUBLIC标识符,请调用DocumentBuilder类的setEntityResolver方法来安装EntityResolver接口的某个实现类的一个对象”。

啥叫支持public标识符?难道是上面的public "-//Sun ...?看样子是的。

class MyEntityResolver implements EntityResolver{  //EntityResolver的实现类

  public InputSource resolveEntity(String publicID, String systemID){

    if(publicID.equals(a known ID)){

      return new InputSource(DTD data);  //这里就是支持public标识符的设置了吧,简单的说就是解析器能够通过public标识符来定位其指定的DTD文档  

    }else{

      return null;

    }

  }

}

真TM绕口,直接看下JDK DocumentBuilder的方法说明:

  setEntityResolver(EntityResolver er) //EntityResolver接口的某个实现类的一个对象

Specify the EntityResolver to be used to resolve entities present in the XML document to be parsed.

明白了。

然后我们就知道,DTD是通过上面这些方式来定位了。

好了,接下来说说具体的。ELEMENT规则用于指定某个元素有什么样的子元素,可以是正则表达式。

<!ELEMENT menu (item)*>   //menu元素包含0或多个item元素

<!ELEMENT font (name,size)>

<!ELEMENT name (#PCDATA)>

<!ELEMENT size (#PCDATA)>

<!ELEMENT chapter (intro, (heading, (para|image|table|note)+)+) //元素嵌套

包含被解析文本#PCDATA的规则有两种,只包含文本、文办加标签:

<!ELEMENT para (#PADATA)>

<!ELEMENT para (#PADATA|em|strong|code)*>

非法的例子:

<!ELEMENT para (image,#PCDATA)>

------------------------------------------------------

描述元素属性的语法规则:

<!ATTLIST element attribute type default>

典型例子:

<!ATTLIST font style (plain|bold|italic|bold-italic) "plain">   //style属性,有4个值,默认为plain

<!ATTLIST size unit CDATA #IMPLIED>  //这里的CDATA与前面XML中的<![CDATA[...]>是没关系的,这里指任意字符串

DTD实体的定义与引用:

<!ENITY back.label "Back">

<menumitem label="&back.label;"/>

DTD介绍完毕。

用法:

factory.setValidating(true);   //启用DTD验证

factory.setIgnoringElementWhitespace(true);  //去掉空格验证

Java核心技术II读书笔记(二)的更多相关文章

  1. Java核心技术II读书笔记(三)

    ch2 XML SAX解析器 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory ...

  2. Java核心技术II读书笔记(一)

    Char2 XML 解析器:读入一个文件,确认其具有正确的格式,然后将其分解成各种元素,使程序员能够访问这些元素. java库提供了两种XML解析器:DOM和SAX,即文档对象模型和流机制解析器. D ...

  3. 深入理解Java虚拟机之读书笔记二 垃圾收集器

    1.对象已死? a.引用计数算法:缺点是它很难解决对象之间的相互循环引用的问题,Java语言中没有选用它. b.根搜索算法(GC Roots Tracing):通过一系列的名为"GC Roo ...

  4. 《Java核心技术》 -- 读书笔记 ② - 类 | 对象 | 接口

    对象vs对象变量 “对象” 描述的是一个类的具体实例,他被java虚拟机分配在 "堆" (Heap)中. “对象变量” 为一个对象的引用(对象变量的值=记载着具体对象的位置/地址) ...

  5. Java常用类库 读书笔记 二

    1.Date类 常用操作方法: public Date ()                         构造方法,实例化Date类对象 public Data(long Date)       ...

  6. 《Java核心技术》 -- 读书笔记 ① - 预热

    引言 之前通过网上的实例自己使用了Java的一些技术及轮子快速的的“烂“造了一些小应用,但是毕竟没有认真地了解和认知Java,遂打算花一个月左右的时间来细细品味一下... 从头开始,慢慢深入!! Ja ...

  7. Java逍遥游记读书笔记<二>

    Abstract抽象类 1.抽象类不能被实例化 2.抽象方法没有方法体 如: public abstract class Weapen { public abstract void attack(); ...

  8. 《深入理解java虚拟机》读书笔记二——第三章

    第三章 垃圾收集器与内存分配策略 1.判断对象是否已死 引用计数法: 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,每当引用失效时,计数器值就减1. 任何时刻计数器为0的对象就是不 ...

  9. 《深入理解Java虚拟机》读书笔记二

    第三章 垃圾收集器与内存分配策略 1.判断对象是否已死 引用计数法: 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,每当引用失效时,计数器值就减1. 任何时刻计数器为0的对象就是不 ...

随机推荐

  1. lintcode:打劫房屋 III

    题目 打劫房屋 III 在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树.与前两次偷窃 ...

  2. TCP网络拥塞控制

    拥塞控制过程 数据吞吐量 TCP窗口大小,窗口流量控制,慢启动对TCP的成块数据传输综合作用,可能对TCP的数据传输有意想不到的影响. RTT(Round-Trip Time) :往返时间.是指一个报 ...

  3. 定制CentOS (Redhat AS 5.1)安装盘

    CentOS(Redhat)提供了一套完整的自动化安装机制,利用该机制,我们可以自己定制无人值守的自动安装光盘,也可以进行系统裁减,甚至可以以CentOS为基础制作自己软件系统的系统安装盘.以下全部内 ...

  4. Zabbix监控解决方案

    思通运维监控主要用来监控IT 基础设施组件的可用性和性能.监控项目是不受限制的,并且可以对IT 基础设施健康状态进行复杂分析.通过确定IT 系统问题的“来源”,使用户快速响应故障来降低宕机成本. 网络 ...

  5. eclipse 代码格式化 行宽设置

    windows--preferences--java--code style--formatter--edit--line wrapping--maximum line width

  6. MDK5.01百度云下载,安装微软雅黑混合字体,字体效果很棒,解决显示中文的BUG

    微软雅黑字体http://pan.baidu.com/s/1nt9Epuh 初步尝试,以前的小BUG都已经解决了.下面是安装雅黑字体后的字体效果,很爽.第一步:安装雅黑字体.第二步:选择Edit--- ...

  7. Sails 自定义 model 方法

    Sails 自定义 model 方法 在 Sails 中 model 提供了一些原生的静态方法,如 .create(), .update(), .destroy(), .find(), 等. 在实际业 ...

  8. RTC系统【转】

    http://blog.csdn.net/fanqipin/article/details/8089995 转自:http://www.cnblogs.com/muhuacat/p/5276306.h ...

  9. mysql0000-00-00日期异常及解决方法

    当mysql的datetime类型的值设置为0000-00-00 00:00:00(或者 0000-00-00)的时候,java的datetime或者timestamp读取到这个值并转换的时候,将抛出 ...

  10. iPhone 如何设置彩信 ?

    使用 iPhone 时,不能使用短信发送图片,肿么办 ? 当然,它会提示你,要你设置彩信.关键是,该怎么设置彩信呢 ? · 首先,打开 “设置” - “蜂窝移动网络” - “蜂窝移动数据网络” (1) ...