Java核心技术II读书笔记(二)
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读书笔记(二)的更多相关文章
- Java核心技术II读书笔记(三)
ch2 XML SAX解析器 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory ...
- Java核心技术II读书笔记(一)
Char2 XML 解析器:读入一个文件,确认其具有正确的格式,然后将其分解成各种元素,使程序员能够访问这些元素. java库提供了两种XML解析器:DOM和SAX,即文档对象模型和流机制解析器. D ...
- 深入理解Java虚拟机之读书笔记二 垃圾收集器
1.对象已死? a.引用计数算法:缺点是它很难解决对象之间的相互循环引用的问题,Java语言中没有选用它. b.根搜索算法(GC Roots Tracing):通过一系列的名为"GC Roo ...
- 《Java核心技术》 -- 读书笔记 ② - 类 | 对象 | 接口
对象vs对象变量 “对象” 描述的是一个类的具体实例,他被java虚拟机分配在 "堆" (Heap)中. “对象变量” 为一个对象的引用(对象变量的值=记载着具体对象的位置/地址) ...
- Java常用类库 读书笔记 二
1.Date类 常用操作方法: public Date () 构造方法,实例化Date类对象 public Data(long Date) ...
- 《Java核心技术》 -- 读书笔记 ① - 预热
引言 之前通过网上的实例自己使用了Java的一些技术及轮子快速的的“烂“造了一些小应用,但是毕竟没有认真地了解和认知Java,遂打算花一个月左右的时间来细细品味一下... 从头开始,慢慢深入!! Ja ...
- Java逍遥游记读书笔记<二>
Abstract抽象类 1.抽象类不能被实例化 2.抽象方法没有方法体 如: public abstract class Weapen { public abstract void attack(); ...
- 《深入理解java虚拟机》读书笔记二——第三章
第三章 垃圾收集器与内存分配策略 1.判断对象是否已死 引用计数法: 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,每当引用失效时,计数器值就减1. 任何时刻计数器为0的对象就是不 ...
- 《深入理解Java虚拟机》读书笔记二
第三章 垃圾收集器与内存分配策略 1.判断对象是否已死 引用计数法: 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,每当引用失效时,计数器值就减1. 任何时刻计数器为0的对象就是不 ...
随机推荐
- PHP5.4最新特性
PHP5.4最新特性 官网:ChangeLog-5.php#5.4.0 原文Oracle:LAMP 体系有了新的竞争,但此版本中的特性使 PHP 再次挑战极限. 稍微做了修改.: 概述总结:1. ...
- Android 注入详解
Android下的注入的效果是类似于Windows下的dll注入,关于Windows下面的注入可以参考这篇文章Windows注入术.而Android一般处理器是arm架构,内核是基于linux,因此进 ...
- linux下PostgreSQL数据库的源码安装
实验环境>>>>>>>>>>>>>>>>>>操作系统:CentOS release 6.3 ...
- ssh超时断开的解决方法
当用SSH Secure Shell连接Linux时,如果几分钟没有任何操作,连接就会断开,必须重新登陆才行,每次都重复相同的操作,很是烦人,本文总结了两种解决的方法. 方法1:更改ssh服务器的配置 ...
- Unable to open debugger port : java.net.ConnectException “Connection refused”
http://stackoverflow.com/questions/28283087/unable-to-open-debugger-port-java-net-connectexception-c ...
- 多项式求ln,求exp,开方,快速幂 学习总结
按理说Po姐姐三月份来讲课的时候我就应该学了 但是当时觉得比较难加上自己比较懒,所以就QAQ了 现在不得不重新弄一遍了 首先说多项式求ln 设G(x)=lnF(x) 我们两边求导可以得到G'(x)=F ...
- Lines演示程序
#include "stdafx.h"#include "d3d9.h"#include "d3dx9.h" #pragma comment ...
- JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-005控制类型映射(Nationalized、@LOB、@org.hibernate.annotations.Type)
一.简介 1. 2. 3. 4. to override this default mapping. The JPA specification has a convenient shortcut a ...
- C编译器剖析PDF文档及UCC编译器162.3
http://blog.csdn.net/sheisc/article/details/42387857 http://blog.csdn.net/sheisc/article/details/455 ...
- 正确的理解this 和 super
this和super是Java的两个关键字. 先明确一个问题,有人错误的认为它们是对象里的“属性”,这只能怪老师没有讲清楚计算机的本质了.因为计算机的处理器只能用指令去处理数据,像C语言之类的容易理解 ...