XML-DTD-解析笔记简单明了
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XML
什么是XML?
XML集SGML与HTML的优点于一身。
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
为什么要学习XML
XML 和 HTML 为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息
XML语言出现的根本目标在于描述上图那种,在现实生活中经常出现的有关系的数据。
在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。
XML在wab中描述配置文件
XML常见应用
XML技术除用于保存有关系的数据之外,它还经常用作软件配置文件,以描述程序模块之间的关系。
在一个软件系统中,为提高系统的灵活性,它所启动的模块通常由其配置文件决定
XML文档规则
格式不良好(malformed)的xml文档:完全没有遵守xml文的基本规范的xml文档。
格式良好(well-formed)的但无效的xml文档: 遵守xml文的基本规范,但没有使用dtd或schema定义语义约束的xml文档。
有效(valid)的xml文档:遵守xml文的基本规范,并使用dtd或schema定义语义约束,而且也完全遵守了dtd或schema定义语义约束的xml文档
XML语法:
“形式良好”或“结构良好”的 XML 文档拥有正确的语法。
“形式良好”(Well Formed)的 XML 文档会遵守前几章介绍过的 XML 语法规则:
XML 文档必须有根元素
XML 文档必须有关闭标签
XML 标签对大小写敏感
XML 元素必须被正确的嵌套
XML 属性必须加引号
一个XML文件分为以下几个部分:
文档声明:
最简单的声明:
编码方式:(当文件中有中文时必须标注编码方式)
文档是否独立:
常见错误:
1.
2.
3.编码错误
注意:在声明前不能有任何字符
元素:
1、XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式。
2、一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不
允许交叉嵌套。
3、格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。
4、对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。
5、对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。
非空元素:
<起始标记>数据/<>>(标记也可以既有标记也有数据)<结束标记>
空元素:
<起始标记>结束标记> <标记 属性=“属性值”/>(单标记)
例子:
一个根标记
学生列表
学生1 学生2
学号 姓名 年龄性别 学号 姓名 年龄性别
<学生列表>
<学生>
<学号>11011225学号>
<姓名> 张三 姓名>
<年龄> 19 年龄>
<班级> 10级Java4班 班级>
学生>
<学生>
<学号>11011226学号>
<姓名> 李四 姓名>
<年龄> 19 年龄>
<班级> 10级Java4班 班级>
学生>
学生列表>
命名规范:
一个XML元素可以包含字母、数字以及其他一些可见字符,但必须遵守下面的一些规范:
1. 区分大小写
2. 不能以数字或”_”(下划线)开头
3. 不能以xml开头
4. 不能包含空格
5. 名称中间不能包含冒号
属性:
1、一个标签可以有多个属性,每个属性有它自己的名字和取值
2、属性值一定用双引号或单引号引起来
3、定义属性必须遵守与标签相同的命名规范
4、在XML技术中标签属性所代表的信息,也可以被改成用子元素的形式来描述
注释:
XML文件中的注释采用:格式。
注意:
XML声明之前不能有注释
注释不能嵌套(注释中间不能出现“—”和可以出现标记<>>)
CDATA区 :
在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出
语法:
]]>
转义字符:
处理指令:
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。
处理指令必须
以“”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
DTD
DTD文件在外部时:
DTD文件在内部时:
]>
XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:
当引用的文件在本地时,采用如下方式:
例如: 。在xml文件中手写一下。
当引用的文件是一个公共的文件时,采用如下方式:
例如:
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"/dtd/web-app_2_3.dtd">
DTD约束语法细节:
元素定义:
在DTD文档中使用ELEMENT声明一个XML元素,语法格式如下所示:
元素类型可以是元素内容、或类型
如为元素内容:则需要使用()括起来,如
如为元素类型,则直接书写,DTD规范定义了如下几种类型:
EMPTY:用于定义空元素,例如
ANY:表示元素内容为任意类型。
元素内容中可以使用如下方式,描述内容的组成关系
用逗号分隔,表示内容的出现顺序必须与声明时一致。
用|分隔,表示任选其一,即多个只能出现一个
在元素内容中也可以使用+、*、?等符号表示元素出现的次数:
+: 一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)
也可使用圆括号( )批量设置,例
DTD规范XML文档
DTD简介:
DTD是一套关于标记的语法规则,它定义了文档的逻辑结构,规定了文档中所使用的元素、实体、元素的属性、元素与实体之间的关系。
为什么使用DTD:
1、验证接收到的数据是否有效
2、用验证自己的数据
3、定义XML文档的合法构建块
4、使用一系列合法元素来定义文档结构
使用DTD的好处:
1、用DTD提供统一格式。例如,用DTD规定个人简历文档的逻辑结构,包括所需填写内容和内容排列方式,所有按照这个DTD编写的个人简历都将具有统一格式。
2、用DTD验证数据有效性。DTD约束文档逻辑结构,可以根据DTD检查数据,验证其是否符合规定要求,确保数据正确和有效。
3、根据DTD编写文档样式单。DTD能在不提供原始资
料的情况下,表示出一个网页或文档的架构元素,这意味着用户能先根据DTD为未来的文档编写样式单,然后再安全且不破坏结构的把用户的资料放上去,提高工作效率。
引入DTD:
内部DTD:
所谓内部DTD是指DTD与XML数据定义放在同一份文档中,即将DTD定义在XML文档内部。内部DTD紧跟在XML声明和处理指令之间。
文档类型声明以“” 开始,以“]>”结束。在XML处理指令和根元素之间定义。
< ? xml version=”1.0” encoding=”GB2312” standalone=”yes” ?>
]>
外部DTD:
外部文件类型定义存在于独立文件中,文件扩展名为“.dtd”。外部DTD的好处是:可以方便地被多个XML文档共享,只需要定义一份DTD文档,即可为多个XML文档定义语义约束。
System :关键字,指该外部DTD是私有的
DTD-URL:通过URL将外部DTD引用到XML文档中,可以是绝对地址也是
可相对地址
注意:
为了让DTD能支持非西欧字符,应该为外部DTD文档指定声明,DTD声明和XML声明的语法完全相同。
公用DTD:
有一种外部DTD,是由某个权威机构制定,供特定行业或公司,这种DTD又被称为公用DTD
公用DTD与外部DTD区别在于:公用DTD使用PUBLIC代替了原来的SYSTEM,并增加了DTD标识名。
DTD文档的结构
DTD文档并不是XML文档,而只是为XML定义语义约束的文档。DTD文档有如下结构:
第1行是DTD声明部分,该声明与XML声明的语法相同
0到多个注释部分,DTD注释与XML注释的语法完全相同
0到多个定义,每个定义一个XML元素
0到多个定义,每个定义一个XML元素定义了一个属性
0到多个定义,每个定义一个实体
0到多个定义,每个定义一个符号
DTD对元素声明:
使用ELEMENT声明XML元素的语法,语法格式如下:
元素声明以“”结束
元素声明指令“ELEMENT”为关键字,必须大写
元素名:为当前元素指定的元素名称
元素内容: 元素名后面的内容用来指定元素的内容类型,它可以分为EMPTY(空)、子元素类型,混合型、ANY(任意)和#PCDATA 5种类型。
空元素类型---EMPTY:
该元素只可能有属性不能有元素内容。声明的空元素的语法如下:
定义字符串内容的元素:
定义只能是字符串元素的语句格式如下:
定义混合内容元素:
某个元素既有字符串内容,又包含子元素,被称为混合内容的元素。一般来说,XML文档不推荐使用混合内容的元素。
注意:
#PCDATA必须放在最前面
#PCDATA和各子元素之间只能用竖线(|)分割
子元素1,子元素2和子元素3之间的竖线(|)并不是表示互斥,而只是表示这些元素能无序的重复出现,而且次数不受限制
不要试图在各个子元素之后添加?,*。+等表示频率的修饰符
定义子元素:
元素包含子元素是XML文档中最常见的情形,DTD可以有效地定义各元素之间的父子关系,从而有效地描述整个文档结构。定义元素包含的子元素时,各个元素之间存在几种逻辑关系。
有序的子元素
互斥的子元素
无序的子元素
有序的字元素:
用英文逗号(,)作为子元素之间的分隔符,则子元素之间必须遵守所定义的顺序。
互斥的字元素:
互斥的子元素表明一系列子元素之间只能出现其中一次。互斥子元素使用竖线(|)分隔,以竖线(|)分隔的多个元素只能出现其中之一。
子元素出现的频率:
子元素的出现频率通过在元素声明后紧跟一个表示频率的特殊标记来表示,DTD中表示频率的特殊标记有3个:
+: 表明子元素可以出现1次或多次
*: 表明子元素可以出现0次或多次
?: 表明子元素可以出现0次或1次
如果在定义子元素时,没有在子元素后指定任何表示频率的特殊标记,则表明这些子元素只能出现一次,且必须一次
无序的字元素:
从理论上讲,DTD没有专门为定义无序子元素提供语法,如果希望使用DTD来表示某个元素之内可以接受无序的子元素。
DTD对属性声明:
属性是描述元素的额外信息的,是对元素的修饰与补充。一般来说,信息详实的XML文档都是一个特点,即元素通过属性来描述边缘信息。
在 DTD 中,属性通过 ATTLIST 声明来进行声明。一个属性声明可以声明一个元素的多个属性。
“属性限定条件”和“默认值‘两部分是可选的吗,有下面几种情况
在没有指定“元素对属性的约束”时,必须为该属性指定“默认值”;
当“元素对属性的约束”是#REQUIRED时,不能为该属性指定“默认值”;
当“元素对属性的约束”是“IMPLIED”时,不能为该属性指定“默值”;
当“元素对属性的约束”是“FIXED”时,必须为该属性指定“默认值”;
对属性的限定条件:
#REQUIRED: 必须的属性,意
味着必须为该元素提供该属性
#IMPLIED: 该属性是可有可无的
#FIXED: 该属性的值是固定的,定义是必须制定固定值。使用该元素时无需为其分配该属性,XML处理器会自动为给属性增加固定值
字符类型:
CDATA 是简单的纯文本字符类型,是最常用的类型,将简单的文本用做属性值。可以包括任何字符串,但不允许使用“<”,“>”,“&”,“””,“‘”。如果需要使用必须使用实体引用。属性值和元素内容都可以是文本类型,但是定义的方法不同
枚举类型:
声明了属性的备选值列表,属性必须从该列表中选择一个值作为属性值。
ID、IDREF、IDREFS类型:
ID类型是一种较为严格的约束,它要求属性值必须是有效地XML标识名,而且在整个XML文件档中其值不能重复。
NMTOKEN和NMTOKENS类型:
NMTOKEN是一个比ID类型更宽松的类型,它只要求该属性是个合法的XML标识。它也是字符串数据,但是约束比CDATA约束要严格,它要求出现的字符要少。
ENTITY和ENTITES类型
定义ENTITY和ENTITIES类型的属性其属性值只能是未解析的实体,与外部数据相连。如图像文件,音像文件等。
注意:
一旦声明某个属性的类型是entity或entities,就意味着该属性值只能是一个或多个未解析的实体,而不是已经解析的实体。对于未解析的实体而言,不能通过普通实体引用方式去引用,他们只能作为entity或entities类型的属性值。
定义实体:
所谓实体引用就是用一个字符串代替另一个字符串。定义实体有如下作用:
提高代码的服用,方便修改,维护XML文档
使用某些特殊的符号,这些特殊的符号可能会使XML解析器混淆
减少字符输入量,如果某个字符串特别长,而且需要经常使用,则可以定义为实体
实体的概念:
实体是包含了文档片段的虚拟存储单元,可用来存储XML声明、DTD、其他形式的文本及二进制数据等。简单来讲就是一段代码或数据的代称,这个代称即为实体
的名字。
当需要在文档中引用某段代码或数据时,可以引用与段代码或数据相对应的实体名称来代替实体的具体内容。具有正确性检查功能的XML处理器在提交文档给最终应用程序之前或在显示文档以前,将先把所有不同的实体引用替换为与其对应的具体内容,从而构成一个结构完整的文档。
实体的分类:
按照实体的具体内容来分类,实体可分为可解析与不可解析两类。可解析实体的具体内容为简单的字符、数字、文本块,而不可解析实体的具体内容则为图片、声音等二进制文件。
按照逻辑存储来分类,实体可分为内部实体与外部实体两类。内部实体
的内容是在文档内部设定的;而外部实体则是一个外部独立的物理存储对象,如某个外部文件。
按照使用的范围来分类,实体可分为一般实体与参数实体两类。一般实体都用来构成文档的具体内容,可出现在XML文档中,也可出现在DTD中;而参数实体只能出现在DTD中,不能出现在XML文档中
定义普通实体:
普通实体是在XML文档里使用的实体,语法如下
使用实体的语法如下:
&实体名;
定义了可在XML文档中使用的实体后,该实体既可以作为某个XML元素的字符串使用,也可以作为某个XML元素的属性值使用
外部普通实体:
外部实体的值不在DTD中直接指定,而是专门
提供一个文件为该实体指定值----“实体值所在的文件的URL”处的文件来指定。定义外部实体的语法格式如下:
外部参数实体:
类似于定义内部参数实体,语法结构如下:
XML解析
对XML解析的标准有两种:Sax和dom
首先是两种标准并不是针对Java的,他们在各种语言环境下都可以实现
dom:DocumentObject Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式,dom是真正的国际标准。
sax:(Simple API for XML) 不是官方标准,是事实的标准,几乎所有的 XML 解析器都支持它。他不由任何商业组织维护,而是由一个非商业的组织在运作。就像iso7层模型和tcp/ip一样,虽然sax不是正式的标准,但是一点不影响他在xml解析领域的地位。
Dom实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。它的主要优势是实现简单,读写平衡;缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。
sax的实现方法和dom不同。他只在xml文档中查找特定条件的内容,并且只提取需要的内容。这样做占用内存小,灵活,正好满足我们的需求。他的缺点就是写,有些资料介绍了写入的方法,但是我感觉这对本例没有必要。后面主要讲解用sax2.0实现xml文档解析。
XML解析器有三种:
Crimson(SUN)、Xerces(Apache)、Aelfred2(dom4j)
开发工具包:jaxp、jdom、dom4j
Jaxp开发包是J2SE的一部分,它是由
编写Java程序完成xml文档的解析:
DOM解析器
Public class DomTest{
pu
blic static void main(String[]atgs){
//第一步生成工厂类对象
DocumentBuilderFactoryfactory=DocumentBuilderFactory.NewInstance();
//第二步声称解析器对象
DocumentBuilderbd=factory.newDocumentBuilder();
//第三步对xml文档进行解析
Document doc=bd.parse(new File(“文件的URL地址”))
//第四部读取book.xml文档中到底有几个节点?节点的名称、节点的类型以及节点的值。
System.out.println(doc.getChildNodes().getLength());
Noderoot=doc.getChildNodes().item(0);
System.out.println(root.getNodeName()+” ”+root.getNodeTyoe()+” ”+root.getNodeValue());
}
}
更新xml文档
Javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出。
Transformer类通过Transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:
javax.xml.transform.dom.DOMSource泪来关联要转换的Document对象。
用javax.xml.transform.Stream.StreamResult对象来表示数据的目的地。
Transformer对象通过TransformerFactory获得。
在使用DOM解析XML文档时,需要读取整个XML文档,在内存中构架代表整个DOM树的Document对象,从而在对XML文档进行操作。
DOM4J解析XML文档
Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM开放的。与JDOM不同的是,dom4j使用接口和抽象的人分离出来而后独立基类,虽然Dom4jSPI相对要复杂一些,但它提供了比JDOM更好的灵活性。
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件。
Document对象
DOM4j中,获得Document对象的方式有三种:
1.读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.解析XML形式的文本,得到document对象.
String text = "
Document document = DocumentHelper.parseText(text);
3.主动创建document对象.
Document document = DocumentHelper.createDocument();
//创建根节点
Element root = document.addElement("members");
Tip:节点对象
1.获取文档的根节点.
Elementroot = document.getRootElement();
2.取得某个节点的子节点.
Elementelement=node.element(“书名");
3.取得节点的文字
Stringtext=node.getText();
4.取得某节点下所有名为“member”的子节点,并进行遍历.
List nodes =rootElm.elements("member");
for (Iterator it = nodes.iterator();it.hasNext();) {
Element elm =(Element) it.next();
// do something
}
5.对某节点下的所有子节点进行遍历.
for(Iterator it=root.elementIterator();it.hasNext();){
Elementelement = (Element) it.next();
//do something
}
6.在某节点下添加子节点.
Element ageElm = newMemberElm.addElement("age");
7.设置节点文字.
element.setText("29");
8.删除某节点.
//childElm是待删除的节点,parentElm是其父节点
parentElm.remove(childElm);
9.添加一个CDATA节点.
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());