第3章 使用DTD规范XML文档
XML轻松学习手册(三)_XML的术语
XML轻松学习手册(三):XML的术语疯狂代码 / ĵ:http://XMLJiaoCheng/Article20193.html 第 3章 ;XML术语2.DTD有关术语什么是DTD,我们上面已经简略提到DTD是种保证XML文档格式正确有效思路方法可以比较XML文档和DTD文件来看文档是否符合规范标准元素和标签使用是否正确个DTD文档包含:元素定义规则元素间关系定义规则元素可使用属性可使用实体或符号规则DTD文件也是个ASCII文本文件后缀名为.dtd例如:myfile.dtd为什么要用DTD文件呢?我理解是它满足了网络共享和数据交互使用DTD最大好处在于DTD文件共享(就是上文DTD介绍说明语句中PUBLIC属性)比如两个相同行业区别地区人使用同个DTD文件来作为文档创建规范标准那么他们数据就很容易交换和共享网上有其他人想补充数据也只需要根据公用DTD规范标准来建立文档就立刻可以加入目前已经有数量众多写好DTD文件可以利用针对区别行业和应用这些DTD文件已经建立了通用元素和标签规则你不需要自己重新创建只要在他们基础上加入你需要新标识当然如果愿意你可以创建自己DTD它可能和你文档配合更加完美建立自己DTD也是很简单件事般只需要定义4-5个元素就可以了DTD文件思路方法有两种:1.直接包含在XML文档内DTD你只要在DOCTYPE声明中插入些特别介绍说明就可以了象这样:我们有个XML文档:<?xml ;version=\"1.0\" ;encoding=\"GB2312\"?><myfile><title>XML轻松学习手册</title><author>ajie</author></myfile>我们在第行后面插入下面代码就可以:<!DOCTYPE ;myfile ;[<!ELEMENT ;title ;(#PCDATA)><!ELEMENT ;author ;(#PCDATA)><!ENTITY ;copyright ;\"Copyright ;2001, ;Ajie.\">]>2.独立DTD文件将DTD文档存为.dtd文件然后在DOCTYPE声明行中例如将下面代码存为myfile.dtd<!ELEMENT ;myfile ;(title, ;author)><!ELEMENT ;title ;(#PCDATA)><!ELEMENT ;author ;(#PCDATA)>然后在XML文档中在第行后插入:<!DOCTYPE ;myfile ;SYSTEM ;\"myfile.dtd\">我们可以看到DTD文档和HTML中js是差不多有关DTD文档具体如何写我们将在下章和XML文档语法起介绍 ; 下面我们来了解DTD有关术语:1.Schema(规划) ;schema是数据规则描述schema做两件事:a.它定义元素数据类型和元素的间关系;b.它定义元素所能包含内容类型DTD就是有关XML文档个schema2.Document ;Tree(文档树) ;\"文档树\"在前面第 2章我们已经提到过它是文档元素分级结构形象表示个文档结构树包含根元素根元素是最顶级元素(就是紧接着XML声明语句后第个元素)看例子:<?xml ;version=\"1.0\"?><filelist> ;<myfile><title>...</title><author>...</author></myfile></filelist>上面例子分 3级结构排列成\"树\"状其中<filelist>就是根元素在XML和DTD文件中第个定义都是根元素3.Parent ;Element(父元素)/Child ;Element(子元素)父元素是指包含有其它元素元素被包含元素称为它子元素看上面\"结构树\"其中<myfile>是父元素<title>,<author>是它子元素而<myfile>又是<filelist>子元素象<title>这样没有包含任何子元素最后级元素我们也称的为\"页元素\"4.Parser(解析软件Software) ;Parser是种检查XML文档是否遵循DTD规范标准工具软件SoftwareXMLparser发展为两类:种是\"非确认类paeser\"只检测文档是否遵守XML语法规则是否用元素标识建立了文档树另种是\"确认类paeser\"它不但检测文档语法结构树而且比较解析你使用元素标识是否遵守了相应DTD文件规范标准Parser能独立使用也可以成为编辑软件Software或浏览器部分在后面相关资源列表里我列出了当前比较流行些parsers 好了通过第 3章学习我们已经了解了些XML和DTD基本术语但是我们还不知道怎样来写这些文件需要遵循什么样语法在下章将重点介绍有关撰写XML和DTD文档语法请继续浏览谢谢! ;2009-2-12 3:46:56疯狂代码 /。
XMLDTD详解
XMLDTD详解XML DTD详解 ⼀个有效的XML⽂档必然是结构正规的,结构正规的XML⽂档不⼀定是有效的,即有效的是格式正规的⼀个⼦集。
本⽂详细介绍DTD,包括其对元素的定义,属性的定义,以及实体的定义。
元素的定义DTD中的修饰符号: 这部分符号可以联系正则表达式的符号来记忆。
属性的定义属性类型——CDATA ⽐如:<!ATTLIST title name CDATA #REQUIRED> 定义了⼀个属性,是属于title元素的,属性名叫name,类型是字符串(包括数字和中⽂),并且是⼀个必须要有的属性。
属性类型——NMTOKEN/NMTOKENS 左边图中因为加了空格⽽出错。
属性类型——ID 类型为ID的属性取值必须是唯⼀的。
从这个例⼦还可以看到同⼀个元素可以⼀次定义多个属性,多个属性之间⽤空格分隔即可。
属性类型——IDREF/IDREFS (“⼉⼦”后⾯漏掉了⼀个斜线)属性类型——Enumerated 实现定义好⼀些值,属性的值必须在所列出的值的范围内。
属性的特点#REQUIRED 元素的所有实例都必须有该属性的值(NOT NULL)。
语法:<!ATTLIST 元素名属性名属性类型 #REQUIRED> DTD⽰例:<!ATTLIST person number CDATA #REQUIRED> XML⽰例:<person number="6788"/>#IMPLIED 元素的实例中可以忽略该属性(NULL)。
语法:<!ATTLIST 元素名属性名属性类型 #IMPLIED> DTD⽰例:<!ATTLIST contact fax CDATA #IMPLIED> XML⽰例:<contact fax="888-228833"/> 没有这个属性也是对的。
#FIXED value 元素实例中该属性的值必须为指定的固定值。
使用DTD规范XML文档
Page 11
3.2.2 各种元素的声明
1.基本字符元素的声明 2.含子元素的严格声明 3.包含任意内容的声明 4.子元素出现次数的声明 5.选择性子元素的声明 6.空元素的声明 7.混合型元素的声明 8.实体的声明
Page 12
1.基本字符元素的声明
Page 16
5.选择性子元素的声明
语法:<!ELEMENT 元素名称 使用规则> 语法:<!ELEMENT 元素名称 (子元素)> (子元素):指示元素中包含的子元素 1如果子元素用“|”分开,说明任选其一。
Page 17
6.空元素的声明
语法:<!ELEMENT 元素名称 使用规则> EMPTY:指示元素的不能有主体内容。 <!ELEMENT 元素名称 EMPTY >
语法:<!ELEMENT 元素名称 使用规则> <!ELEMENT 元素名称 (#PCDATA) > 指示元素的主体内容只能是普通的文 本.(Parsed Character Data)
Page 13
2.含子元素的严格声明
语法:<!ELEMENT 元素名称 使用规则> <!ELEMENT 元素名称 (子元素)> (子元素):指示元素中包含的子元素 如果子元素用逗号分开,说明必须按照声明 顺序去编写XML文档 <!ELEMENT 元素名称 (子元素1,子元素2,子 元素3,…)>
Page 19
要宣告混合内容的元素型态,你可以使用下列两 种内容模型格式的任何一种: 1 只有字符数据 。要宣告只包含字符数据的元 素型态,使用内容模型(#PCDATA)。例如, 下面的宣告让SUBTITLE 元素只能包含字符数据: <!ELEMENT SUBTITLE (#PCDATA)> 根据这个宣告,下面两个元素都是有效的: <SUBTITLE>A New Approach</SUBTITLE> <SUBTITLE></SUBTITLE>
xml基本写法和dtdschema的用法,JAVA读写XML
xml基本写法和dtdschema的⽤法,JAVA读写XML1. 标记语⾔ 标记语⾔,是⼀种⽂本(Text)以及⽂本相关的其他信息结合起来,展现出关于⽂档结构和数据处理细节的电脑⽂字编码.当今⼴泛使⽤的标记语⾔是超⽂本标记语⾔(Hyper Text Markup Language,HTML)和可扩展标记语⾔(eXtensible Markup Language,XML). 标记语⾔⼴泛应⽤于⽹页和⽹络应⽤程序.1) 超⽂本标记语⾔HTML(Hyper Text Markup Language)写法格式: <a href="link.html">link</a>关注数据的展⽰与⽤户体验标记是固定的,不可扩展(如<a></a>表⽰超连接)2) 可扩展的标记语⾔XML(eXtensible Markup Language)写法格式:同html样式<a>link</a>仅关注数据本⾝标记可扩展,可⾃定义3) Xml 和 Html语⾔由同⼀种⽗语⾔SGML(Standard Generalized Markup language,标准通⽤标记语⾔)发展出来.4)解析器专业解析器(⽐如:XML SPY 专⽤于解析XML⽂件)浏览器MyEclipse5)W3C(World Wide Web Consortium)W3C:开源的语⾔协会,万维⽹联盟(World Wide Web Consortium)HTML 和 XML 都是W3C制定的语⾔规则官⽹:学习⽹站:2.xml语法规则2.1 xml的声明:xml的声明必须写在⽂件第⼀⾏Encoding(字符集)属性可以省略,默认的字符集是utf-8例⼦:1<?xml version="1.0" encoding="UTF-8"?>2<书>3<武侠⼩说 isbn="1001">4<书名>天龙⼋部</书名>5<作者>⾦庸</作者>6<价格>50</价格>7<简介>⼀本好书</简介>8</武侠⼩说>9<计算机>10<书名>疯狂java</书名>11<作者>李刚</作者>12<价格>50</价格>13<简介>⼀本好书</简介>14</计算机>15</书>常见错误写法:1) "?"和xml之间不能有空格2) 声明必须顶头写,不能有空⾏或空格(⽤FireFox浏览器打开)3) 等号左右不要多写空格(java程序员的习惯)浏览器不会报错,但是在xml解析时会出问题2.2 标记1)诸如<书名></书名>,这样格式的被称为标记2)标记必须成对出现3)标记包含开始标记和结束标记<书名>天龙⼋部</书名>注意:标记⼤⼩写敏感2.3元素(Element)1) 元素: 元素= 标记 + 其中内容 ,如<书名>天龙⼋部</书名>2) 根元素: 最外层的元素 (如 <书></书>)3) 叶⼦元素: 最⾥层(没有⼦元素的)的元素 (如,<书名></书名>,<价格></价格>)4) 空元素: 没有内容的元素叫空元素,⽐如:<a></a> ,<br></br>,可以简写为<a/> <br/>5) 元素必须遵循的语法规则a. 所有的标记都必须有结束b.开始标记和结束标记必须成对出现c.元素必须正确嵌套<a><b>c</b></a> (正确)<a><b>c</a></b> (错误)d.标记的⼤⼩写敏感Hello 和 hello不是同⼀个标记e.有且只能有⼀个根元素2.4 实体引⽤(转义字符)1) ⼩于号(<) : less then --> <2) ⼤于号(>) : great than --> >3) And符号(&) : &4) 双引号 ( ") : "5) 单引号( ') : '注意这些转义字符都是以&开头,以 ; 结尾例如:想给天龙⼋部加上书名号<<天龙⼋部>><?xml version="1.0" encoding="UTF-8"?><书><武侠⼩说 isbn="1001"><书名><<天龙⼋部>></书名><作者>⾦庸</作者><价格>50</价格><简介>⼀本好书</简介></武侠⼩说></书>2.5属性(定义在开始标记中的键值对)1)格式: 属性="属性值"如<武侠⼩说 isbn="1234"></武侠⼩说>isbn是武侠⼩说的属性,值是12342)要求:属性必须有值属性值必须⽤引号引起来,单引号或双引号都可以,但必须⼀致2.6 CDATA 类型的数据:特殊标签1) 格式: <![CDATA[⽂本内容]]>2) 特殊标签中的实体引⽤都被忽略,所有内容被当成⼀整块⽂本数据对待例如<书><武侠⼩说 isbn="1235" lang="zh"><书名 hot="true">笑笑江湖</书名><作者>⾦庸</作者><价格>45</价格><简介><![CDATA[⼀本好书,没有<<笑傲江湖>>好看]]></简介></武侠⼩说></书>2.8 注释(xml和html相同)1)格式: <!-- 这是⼀段注释 -->2) 编译器将忽略注释3) Html和xml注释⽅式相同例⼦:1<?xml version="1.0" encoding="UTF-8"?>2<书>3<!-- 这是⼀段注释 -->4<武侠⼩说 isbn="1001">5<书名><<天龙⼋部>></书名>6<作者>⾦庸</作者>7<价格>50</价格>8<简介>⼀本好书</简介>9</武侠⼩说>10</书>2.8 规则⼩结1) 必须有唯⼀的根元素2) xml标记⼤⼩写敏感3) 标记必须配对出现,有开始有结束4) 元素必须被正确嵌套5) 属性必须有值,值必须⽤引号引起来6) 如果遵循全部上述规则,称作well-formed⽂件(格式良好的xml⽂件) 2.9 使⽤XML⽂件描述数据的例⼦1) 早期属性⽂件描述数据的⽅式url = jdbd:oracle:thin@192.168.0.205:1521:dbsiddbUser = openlabdbPwd = open1232) 现在使⽤xml表⽰⽅式<?xml version="1.0" encoding="UTF-8"?><书><!-- 这是⼀段注释 --><武侠⼩说 isbn="1001"><书名><<天龙⼋部>></书名><作者>⾦庸</作者><价格>50</价格><简介>⼀本好书</简介></武侠⼩说></书>3. DTD/Schema1) DTD/Schema:⽤来规范XML的标记规则2)有效的xml⽂件(valid xml file) = 格式良好的xml⽂件 + 有DTD或Schema规则 + 遵循DTD或Schema规则3.1 DTD/Schema的作⽤⾏业交换数据时要求xml⽂件格式相同,所以需要⼤家遵守规范的xml⽂件格式,⽐如两份xml⽂件要有相同的元素嵌套关系,相同的属性定义,相同的元素顺序,元素出现相同次数等3.2⽂档类型定义DTD(Document Type Difinition)1) DTD⽂档⽤来定义XML⽂件的格式,约束XML⽂件中的标记规则2) DTD类型PUBLIC(⾏业共⽤的)SYSTEM(⼩范围⾃定义的)3.2.1 DTD中的定义规则必须列出所有节点,⼀个都不能少1)元素"*"星号表⽰可以出现0-n次"+"加号表⽰可以出现1-n次"|" 表⽰或(只能出现⼀个)如(phone|mobile)表⽰固话或⼿机⼆选⼀"?"问号: 表⽰出现0或1此#PCDATA 表⽰字符串2)属性:定义在开始标记中的键值对dtd 规则_属性1) <!ATTLIST 标记名称属性名称属性类型>2) isbn CDATA #REQUIRED: 表⽰isbn属性是必须的3) isbn CDATA #IMPLIED: 表⽰isbn属性不是必须的4) hot CDATA"false" :表⽰hot默认值是false例⼦3.2.1⾸先是dtd⽂件book.dtd<!ELEMENT 书 (武侠⼩说, br)*><!ELEMENT 武侠⼩说 (书名,作者+,价格,简介)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 作者 (#PCDATA)><!ELEMENT 价格 (#PCDATA)><!ELEMENT 简介 (#PCDATA)><!ELEMENT br EMPTY><!ATTLIST 武侠⼩说 isbn CDATA #REQUIREDlang CDATA #IMPLIED><!ATTLIST 书名 hot CDATA #IMPLIED>在XML中使⽤<?xml version="1.0"?><!DOCTYPE 书 SYSTEM "book.dtd"><书><武侠⼩说 isbn="1234" lang="zh"><书名 hot="false"><<天龙⼋部>></书名><作者>⾦庸</作者><作者>古龙</作者><价格>45</价格><简介>⼀本好书</简介></武侠⼩说><br></br><武侠⼩说 isbn="1235" lang="zh"><书名 hot="true">笑笑江湖</书名><作者>⾦庸</作者><价格>45</价格><简介><!-- 这是⼀段注释 --><![CDATA[⼀本好书,没有<<笑傲江湖>>好看CDATA中的所有特殊字符都不解释(原样显⽰)]]></简介></武侠⼩说><br></br></书>3.3 Schema ,DTD的升级版与DTD的区别1)命名空间(NameSpace)XML⽂件允许⾃定义标记,所以可能出现来⾃不同源DTD或Schema⽂件的同名标记,为了区分这些标记,就需要使⽤命名空间.命名空间的⽬的是有效的区分来⾃不同DTD的相同标记⽐如xml中⽂件中使⽤了命名空间区分开"表格"和"桌则":<html:table><line><column>这是⼀个表格</column></line></html;table><product:table><type>coff table</type><product:table>2) 因为DTD⽆法解决命名冲突,所以出现Schema,它是DTD 的替代者,dtd和Schema的功能都是描述xml结构的3) Schema使⽤xml语法实现(Schema本⾝就是xml⽂件)因为⽤于规范和描述xml⽂件的定义⽂件(schema)本⾝也是xml⽂件,所也xml也被称为⾃描述的语⾔4) Schema ⽂件的扩展名xds: XML Schema Difinition(简称XSD,遵循W3C标准)5) Schema中的名词:复杂元素(有⼦元素的元素)简单元素(叶⼦元素)例⼦:email.xsd<?xml version="1.0" encoding="UTF-8"?><schema xmlns="/2001/XMLSchema" targetNamespace="/email" xmlns:tns="/email" elementFormDefault="qualified"> <element name="email"><complexType><sequence><element name="from" type="string"/><element name="to" type="string"/><element name="subject" type="string"/><element name="body" type="string"/></sequence></complexType></element></schema>被规范的⽂件email.xml<?xml version="1.0" encoding="UTF-8"?><tns:email xmlns:tns="/email" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/email email.xsd "><tns:from>赵敏</tns:from><tns:to>张⽆忌</tns:to><tns:subject>HIHI</tns:subject><tns:body>看泰坦尼克号</tns:body></tns:email>3.4 根据DTD或者Schema来写xml⽂件的⽅法在MyEclipse中右键New --> xml (Basic Templates) -->输⼊⽂件名-->next-->选择是DTD还是Schema4. java API 解析XML⽂件(读xml⽂件)1) Java 与xml有很多共同点(⽐如跨平台,与⼚商⽆关),⽬前位置java对xml的解析较其他语⾔更完善2) 两种解析⽅式:DOM(Document Object Model ⽂档对象模型)关键字:树(Document)优点: 把xml⽂件在内存中构造树形结构,可以遍历和修改节点缺点: 如果⽂件⽐较⼤,内存有压⼒,解析的时间会⽐较长SAX(Simple API for Xml基于XML的简单API)关键字:流(Stream)把xml⽂件作为输⼊流,触发标记开始,内容开始,标记结束等动作优点:解析可以⽴即开始,速度快,没有内存压⼒缺点:不能对节点做修改3) JDOM/DOM4J : ⽬前市场上常⽤的两种解析XML⽂件的API dom4j-1.6.1.jar 结合了DOM和SAX两种解析⽅式的优点DOM4j解析xml⽂件步骤1) 创建项⽬XMLDemo2) 加⼊dom4j的jar包(dom4j-1.6-1.jar)3) 将要解析的xml⽂件放在路径src/下4) 新建ReadXMLDemo.java4-1)构造document对象SAXReader reader = new SAXReader();Document doc = reader.read(file);4-2)取根元素:Element root = doc.getRootElement();4-3)常⽤⽅法Element elmt;elmt.elements("标记名称"):取出所有指定标记名称的元素elmt.element("标记名称"):取出第⼀个指定标记名称元素elmt.elementText("标记名称"):取elmt指定名字的⼦元素elmt.getText();取当前元素的内容Iterator it = elmt.elementsIterator("标记名称") 返回⼀个Iterator String 属性值 = elmt.attattributeValue("属性名")例⼦:ReadBookdemo源代码package day1;import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*;/*** 读⼊book.xml⽂件,取出数据并打印* @author soft01**/public class ReadBookdemo {public static void main(String[] args) {readBook("book.xml");}/*** 读⼊指定的xml⽂件,取出数据并打印* @param string*/private static void readBook(String filename) {//1..读⼊指定的⽂件,构造Document对象File file = new File(filename);SAXReader reader = new SAXReader();//XML⽂件解析器try {Document doc = reader.read(file);//解析器开始解析xml⽂件//2.获得根元素Element root = doc.getRootElement();//3.递归搜索⼦元素/* List<Element> list = root.elements("武侠⼩说");//迭代武侠⼩说的元素集合Iterator<Element> it = list.iterator(); */Iterator<Element> it = root.elementIterator("武侠⼩说");while(it.hasNext()){Element bookElmt = it.next(); //bookEmlt是武侠⼩说元素//取武侠⼩说的⼦元素System.out.println(bookElmt.elementText("书名"));//取⼦元素书名的内容 List<Element> authorList = bookElmt.elements("作者");for (Element element : authorList) {//打印作者元素内容System.out.println(element.getText());}System.out.println(bookElmt.elementText("价格"));System.out.println(bookElmt.elementText("简介"));//取武侠⼩说的属性String isbnValue = bookElmt.attributeValue("isbn");//取武侠⼩说的 lang元素String langValue = bookElmt.attributeValue("lang");System.out.println("isbn="+isbnValue);System.out.println("lang="+langValue);//取⼦元素中的属性Element nameElmt = bookElmt.element("书名");System.out.println(nameElmt.attributeValue("hot"));System.out.println("-----------------");}} catch (DocumentException e) {e.printStackTrace();}}}book.xml如下<?xml version="1.0"?><书><武侠⼩说 isbn="1234" lang="zh"><书名 hot="false"><<天龙⼋部>></书名><作者>⾦庸</作者><作者>古龙</作者><价格>45</价格><简介>⼀本好书</简介></武侠⼩说><br></br><武侠⼩说 isbn="1235" lang="zh"><书名 hot="true">笑笑江湖</书名><作者>⾦庸</作者><价格>45</价格><简介><!-- 这是⼀段注释 --><![CDATA[⼀本好书,没有<<笑傲江湖>>好看CDATA中的所有特殊字符都不解释(原样显⽰)]]></简介></武侠⼩说><br></br></书>5 DOM4j API解析XML⽂件(⽣成)1)常⽤API⽅法:给元素增加⼦元素: elmt.addElement("标记名称");给元素增加属性: elmt.addAttribute("属性名","属性值");给叶⼦元素设值: elmt.setText("元素值");例如:要⽣成以下xml⽂件<book isbn="1001" catalog = "科幻"><name>阿⾥波特</name><author>罗林</author><price>60</price><year>2005</year></book>步骤:1.构造空的Document2.构造根元素3.递归构造⼦元素4.输出WriteBookDemo源代码package day1;import java.io.*;import org.dom4j.*;import org.dom4j.io.*;/*** 利⽤DOM4J写出xml⽂件* @author soft01**/public class WriteBookDemo {static String [][] data={{"1001", "科幻", "阿⾥波特", "罗林","60", "2005","en"},{"1002", "迷幻", "⼩波特", "罗4林","60", "2005","zh"},{"1003", "⽞幻", "中波特", "罗3林","60", "2005","en"},{"1004", "奇幻", "⼤波特", "罗2林","60", "2005","zh"}};public static void main(String[] args) {writeBook("mybook.xml");}/*** 把书的数据⽣成到指定名字的xml⽂件中* @param filename*/public static void writeBook(String filename){// 1.构造空的DocumentDocument doc = DocumentHelper.createDocument();// 2.构造根元素Element rootElmt = doc.addElement("booklist");// 3.递归构造⼦元素for(String[] book:data){Element bookElmt = rootElmt.addElement("book");//book 元素增加属性bookElmt.addAttribute("isbn", book[0]);bookElmt.addAttribute("catalog", book[1]);Element nameElmt = bookElmt.addElement("name");nameElmt.setText(book[2]);//给name 加属性nameElmt.addAttribute("lang", book[6]);Element authorElmt = bookElmt.addElement("author");authorElmt.setText(book[3]);Element priceElmt = bookElmt.addElement("price");priceElmt.setText(book[4]);Element yearElmt = bookElmt.addElement("year");yearElmt.setText(book[5]);}// 4.输出outputXml(doc,filename);}public static void outputXml(Document doc,String filename){try {//定义输出流的⽬的地FileWriter fw = new FileWriter(filename);//定义输出格式和字符集OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");//定义⽤于输出xml⽂件的XMLWriter对象XMLWriter xmlWriter = new XMLWriter(fw,format);xmlWriter.write(doc);xmlWriter.close();} catch (IOException e) {e.printStackTrace();}}}注意:运⾏程序⽣成的mybooks.xmlpackage day1;不⾃动装载,需要刷新⼀下程序运⾏通过后,在项⽬上点击右键"refreash"(或F5)如果是从别的⼯作区导⼊的项⽬,需要去别的⼯作区⽬录下找⽣成的XML⽂件6XPath(w3c的标准)1) XPath:在XML⽂件中查找或定位信息的语⾔,相当于SQL中的 selectXPath 可以通过元素/属性/值来定位或导航2) 节点(Node):相当于xml⽂件中的元素3) 指定条件定位元素的⽅式例⼦:package day1;import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*;/*** 测试XPath的功能* @author soft01**/public class XPathDemo {public static void main(String[] args) {findBook("mybook.xml");}public static void findBook(String filename){SAXReader reader = new SAXReader();try {//获得⽂档对象Document doc = reader.read(new File(filename));Node node =doc.selectSingleNode("/booklist");//查找所有的catalog="奇幻"的书2//String sql = "book[@catalog ='奇幻']";//价格>50的书//String sql = "book[price>50]";//作者等于罗林的书,并且价格⼤于50//String sql ="book[author='罗林' and price>50]";//价格⼤于50,且语⾔是zhString sql = "book[price>50 and name[@lang='zh']]"; List<Element> books = node.selectNodes(sql);for(Element e:books){System.out.println(e.getStringValue());}} catch (DocumentException e) {e.printStackTrace();}}}。
第三章html、xml与xhtml
第三章html、xml与xhtmlHTML:超文本标记语言或超文本链接标示语言,是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言。
HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。
HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。
HTML标签通常是英文词汇的全称(如块引用:blockquote)或缩略语(如“p”代表Paragraph),但它们的与一般文本有区别,因为它们放在单书名号里。
故Paragragh 标签是<p>,块引用标签是<blockquote>。
有些标签说明页面如何被格式化(例如,开始一个新段落),其他则说明这些词如何显示(<b>使文字变粗)还有一些其他标签提供在页面上不显示的信息--例如标题。
HTML标准的版本历史:超文本置标语言(第一版)——在1993年6月发为互联网工程工作小组 (IETF)工作草案发布(并非标准).HTML 2.0——1995年11月作为RFC 1866发布,在RFC 2854于2000年6月发布之后被宣布已经过时HTML 3.2——1996年1月14日,W3C推荐标准HTML 4.0——1997年12月18日,W3C推荐标准HTML 4.01(微小改进)——1999年12月24日,W3C推荐标准HTML 5——2007年HTML 5草案被W3C接纳,并成立了新的HTML工作团队。
08年1月22日第一份正式HTML 5草案发布。
XML:即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。
Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。
扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。
JSP XML 使用DTD规范XML文档
JSP XML 使用DTD规范XML文档
DTD可以指定用在XML文档中的元素、属性和实体,以及这三者之间的联系等,使XML文档具有预定义的逻辑层次结构,从而更容易实现数据共享。
本练习使用DTD来规范XML文件的学生信息。
具体步骤如下所示:
(1)确定与学生有关的核心信息。
与学生有关的信息可以有很多,这里可以简化为包括信息有:姓名、编号、性别、年龄等信息。
(2)编写DTD文件。
学生是学校中的一员,具有层次结构,所以通过班级把
在上述声明中规定,根过元素为“学校”,“学校”可以有一个或多个“班级”子元素,同时“学校”也有自己的属性“编号”;“班级”可以有一个或多“学生”子元素,“班级”也有自己的属性“编号”;同样“学生”可以包含子元素“姓名”、“性别”、“年龄”各一个,同时“学生”也有自己的属性“编号”。
(3)编写XML文档。
在与student.dtd文件所在的目录下创建XML文件:stu
上述XML文件中引用外部DTD规范,使用浏览器中打开XML文档,如图7-21所示。
图7-21 学生信息。
第3章在XML文档中使用DTD解读
• 2. Enumerated型
– 如果属性值并不是任意的字符串,而是在 几个可能的值中进行选择,如书籍的“类 别”属性,其值可为“文艺”,也可为 “自然科学”,而不可能为其他情况时, 则可以将书籍的“类别”属性设定为 Enumerated型。
3. ID型 • 当元素的某个属性值是不能重复时,如 书籍的ISBN属性、个人的“身份证号”属 性等,要定义这样的属性则需使用属性的ID 类型。在一个XML文档中,所有元素的ID类 型属性的属性值必须是唯一的,不可重复, 另外,一个元素不能有超过一个ID类型的属 性。
不限定元素内容的声明
• ANY是DTD中使用很频繁的一个关键字, 特别是对于文档根元素的声明。在定义一个 DTD文档时通常很难准确地确定一个元素是 否具有子元素的情况,此时一般的做法是指 定该元素的子元素为ANY型,这样在它之中 可以包含任何数据、任何声明的子元素及其 数据和子元素的组合。 •
ANY元素lt;!DOCTYPE 根元素名称 [定义的内容]> – 其中“[定义的内容]”是用标签<!ELEMENT>定 义,它包括:
• • • • 元素类型声明; 元素属性声明; 实体声明; 记法声明。
3.1 DTD概述
• 内部DTD文件示例
<?xml version="1.0" encoding="gb2312" standalone="yes"?> <!DOCTYPE 持股信息 [ <!ELEMENT 持股信息 (股东)*> <!ELEMENT 股东 (姓名, 武商股份, 神龙电业, 浦发银行, 兴和基金)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT 武商股份 (#PCDATA)> <!ELEMENT 神龙电业 (#PCDATA)> <!ELEMENT 浦发银行 (#PCDATA)> <!ELEMENT 兴和基金 (#PCDATA)> ]>
第3章_DTD文档类型定义
2 定义元素及其后代(4)
复合型元素的声明,即定义元素及其子元素: DTD尽管要求严格,但也有它的灵活性。使用正则表达式,我们就 可以描述父元素与子元素之间非常复杂的关系。下面就是描述子 元素的正则式:
元 字 符 + * ? 含 义 出现一次或多次 出现零次或多次 不出现或出现一次
()
| ,
一组要共同匹配的表达式
2 定义元素及其后代(6)
重复元素 DTD定义(+:至少出现一次) <!ELEMENT 联系人 (姓名,EMAIL+)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> 下面的XML片断是有效的: <联系人> <姓名>张三</姓名> <EMAIL>zhang@</EMAIL> <EMAIL>zhang@</EMAIL> <EMAIL>zhang@</EMAIL> </联系人> 而下面这个XML片断不是有效的: <联系人> <姓名>张三</姓名> </联系人>
2 定义元素及其后代(1)
元素的声明: 元素声明不但说明了每个XML文件中可能存在的元素,给出了元 素的名字,而且给出了元素的具体类型。一个XML元素可以为空, 也可以是一段纯文本,还可以有若干个子元素,而这些子元素同时 又可以有它们的子元素。DTD正是通过元素之间的父子关系,描 述了整个文件的结构关系。 元素的声明形式为: <!ELEMENT 元素名 元素内容描述> 元素内容可分为如下的3个类型: 简单型:元素内容是可解析的字符数据(Parsed Character Data, PCDATA),即不含有子元素的文本。 复合型:元素的内容含有其它元素,既有子元素。 混合型:元素的内容既有文本数据又有子元素。
DTD+教程
DTD 简介文档类型定义( 文档构建模块。
它使用一系列合法的元素来定义文档的结构。
文档类型定义(DTD)可定义合法的 XML 文档构建模块。
它使用一系列合法的元素来定义文档的结构。
)DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
文档中,也可作为一个外部引用。
内部的 DOCTYPE 声明假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:<!DOCTYPE 根元素 [元素声明]>带有 DTD 的 XML 文档实例(请在 IE5 以及更高的版本打开,并选择查看源代码):<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to <!ELEMENT from (#PCDATA)> (#PCDATA)><!ELEMENT heading (#PCDATA)> <!ELEMENT body ]> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting this weekend!</body> </note> (#PCDATA)>在您的浏览器中打开此 XML 文件,并选择“查看源代码”命令。
解释如下: 以上 DTD 解释如下:!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型!ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 类型!ELEMENT heading (第五行)定义 heading 元素为 "#PCDATA" 类型!ELEMENT body (第五行)定义 body 元素为 "#PCDATA" 类型外部文档声明假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:<!DOCTYPE 根元素 SYSTEM "文件名">这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD: (在 IE5 中打开,并选择“查看源代码”命令。
DTD规范XML文档
DTD规范XML文档DTD是一套关于标记的语法规则,它定义了文档的逻辑结构,规定了文档中所使用的元素、实体、元素的属性、元素与实体之间的关系。
一引入DTD(3种方式)1 内部DTD——内部的DTD紧跟在XML声明和处理指令之间。
< ? xml version=”1.0” encoding=”GB2312” standalone=”yes” ?><! DOCTYPE 根元素名称 [<! ELEMENT 子元素名称 (#PCDATA)>]>2 外部DTD外部文件类型定义存在于独立文件中,文件扩展名为“dtd”。
外部DTD的了处:可以方便地被多个XML文档共享,只需要定义一份DTD文档,即可为多个XML文档定义语义约束。
<!DOCTYPE 根元素名 SYSTEM " DTD-URL ">SYSTEM:关键字,指该外部DTD是私有的DTD-URL:通过URL将外部DTD引用到XML文档中,可以是绝对地址也是可以相对地址。
3公用DTD<!DOCTYPE 根元素名 PUBLIC " DTD-NAME ““DTD-URL”>公用DTD与外部DTD区别在于:公用DTD使用PUBLIC代替了原来的SYSTEM,并增加了DTD标识名。
二 DTD文档的结构<?xml version="1.0" encoding="UTF-8"?> DTD声明部分,DTD注释与XML 注释的语法完全相同<!ELEMENT …>定义一个XML元素<!ELEMENT …>…<!ATTLIST …>定义一个XML元素定义了一个属性<!ATTLIST …>…<!EMTITY…>定义一个实体…<!NOTATION…>定义一个符号...三 DTD对元素声明【重点】使用ELEMENT声明XML元素的语法, <!ELEMENT 元素名元素内容> 注:元素声明以“<!”开始,以“>”结束;元素声明指令“ELEMENT”为关键字,必须大写;元素名:为当前元素指定的元素名称;元素内容:元素名后面的内容用来指定元素的内容类型,可分为EMPTY(空)、子元素类型,混合型、ANY(任意)和#PCDATA 五种类型;DTD必须定义XML文档中允许出现的所有元素。
第3章_XML基础
3
XML逻辑结构 XML逻辑结构
一个XML文件通常以一个XML声明开始,后面通过 一个XML文件通常以一个XML声明开始 后面通过XML XML文件通常以一个XML声明开始 后面通过XML 元素来组织XML数据 来组织XML数据。 元素来组织XML数据。 XML元素包括标记 字符数据。为了组织数据更 XML元素包括标记和字符数据 为了组织数据更 元素包括标记和 加方便、清晰,我们还可以在字符数据中引入CDATA CDATA数 加方便、清晰,我们还可以在字符数据中引入CDATA数 据块,并可以在文件中引入注释 此外, 注释。此外 据块,并可以在文件中引入注释 此外,由于有时需要 XML处理程序提供一些指示信息 XML文件中可以包含 处理程序提供一些指示信息, 给XML处理程序提供一些指示信息,XML文件中可以包含 处理指示。 处理指示 元素的内容可以包含子元素 字符数据、字符引用、实 子元素、字符数据 字符引用、 元素的内容 子元素 字符数据、 体引用和CDATA CDATA段 体引用和CDATA段。
4
XML的结构
XML文档在逻辑上有六部分组成 文档在逻辑上有六部分组成
1. XML的声明文档 的声明文档 2.文档类型声明 文档类型声明 3.元素 元素 4.注释 注释 5处理指令 处理指令. 处理指令 6属性 属性
5
XML声明 XML声明
XML种规定,每个XML文件都必须以XML声明开头, XML种规定,每个XML文件都必须以XML声明开头,其中 种规定 XML文件都必须以XML声明开头 包括XML版本属性,字符集属性,独立属性等信息。注意: 包括XML版本属性,字符集属性,独立属性等信息。注意:在 XML版本属性 等信息 XML声明的前面不允许再有任何其他的字符, XML声明的前面不允许再有任何其他的字符,也就是说不能有 声明的前面不允许再有任何其他的字符 空白其他的处理指令或注释。 空白其他的处理指令或注释。
第三章 XML语法检 查DTD
DTD的属性声明
2、枚举类型 枚举类型并不需要使用一个关键字,它只 是将所有的属性列举出来,并以竖线分隔。枚 举类型的每一个可能值都必须遵循XML的名称 命名规则,然后就可以从这些值中选出一个作 为属性值。 例:<!- - DTD部分 - - > <!ATTLIST PET HOTSELL (TRUE|FALSE) “FALSE” > <!- - 文件元素部分- - > <PET HOTSELL = “TRUE”>热卖中!</PET>
DTD的属性声明
3、NMTOKEN类型 NMTOKEN规定属性值必须是正确的XML名称 (即必须以字母或下划线开头,后面的字符可 以为字母、数字、下划线、连字符和点号,但 不可包含空格)。 如: <!- - DTD部分 - - > <!ATTLIST CUSTOMER COUNTRY NMTOKEN #REQUIRED > <!- - 文件元素部分- - > <CUSTOMER COUNTRY=“CHN”>…… </CUSTOMER>
DTD的元素声明
3、声明空元素的声明格式: <!ELEMENT 元素名 EMPTY> • 该结构当声明的XML文档元素的内容为空时, 有效。如: <!- - DTD部分 - - > <!ELEMENT 位置 EMPTY> <!- - 文件元素部分- - > <位置></位置>
DTD的元素声明
4、声明自由类型元素的格式: <!ELEMENT 元素名 ANY> • 元素的内容可以是任何数据: 任何被声明过的元素,元素出现的顺序和次数不 受限制; 文本内容或CDATA段 例:example3.xml 5、混合类型 若某元素既包含子元素又包含已编译的字符数据,则 该元素具有混合内容。其声明的语法如下: <! ELEMENT pick (#PCDATA | one | two | three)*>
第3章 文档类型定义DTD
“URL_DTD”为外部私有DTD文件的路径,可以是绝对路径,
也可以是相对路径。 “>”表示引用外部私有DTD文件指令的结束。
LOGO
引用外部公共DTD文件
<!DOCTYPE 根元素 PUBLIC “公共DTD名称” “DTD_URL”>
“<!DOCTYPE”中的“<!”表示一条指令的开始,“DOCTYPE” 表示该指令为文档类型定义指令,是关键字,必须大写。而且 在“<!”和“DOCTYPE”之间不允许加空格。 “根元素”为DTD根元素的名字,该名称必须为XML文档中 根元素的名称。 “PUBLIC”为引用外部公共DTD文件的关键字。同样的这个关 键字也必须全为大写。 “公共DTD名称”是DTD的名称,它是一个正式共用标识符。 “URL_DTD”为外部公共DTD文件的路径,一般为URL值。
属性值可有可无的属性
固定取值的属性 默认值
LOGO
CDATA类型 枚举类型 NMTOKEN类型 NMTOKENS类型 ID类型 IDREF类型 IDREFS类型 ENTITY类型 ENTITYS类型 NOTATION类型
属性类型
LOGO
实体的分类
灵活性,但有时需要的是统一,要求某一类文档具有相同
的结构。 可以保证数据交流和共享的顺利进行。 使用户能够不依赖具体的数据就能知道文档的逻辑结构。 可以验证数据的有效性。
LOGO
DTD的基本结构
“<!DOCTYPE”为DTD定义的开始标记,“>”为DTD定义
的结束标记。
“职工列表”为XML文档的根元素,对XML文档的规定要 放到根元素后面的一对中括号中。 “<!ELEMENT”为元素定义的开始标记,“>”为元素定义 的结束标记。
文档类型定义
DTD-name只能包含字母、数字、空格和以下符 号:_%$#@()+:=/!*;?。 同时,DTD名称还必须符合一些标准的规定。例 如,ISO标准的DTD以“ISO”三个字母开头;被 改进的非ISO 标准的DTD以加号“+”开头;未被 改进的非ISO标准的DTD以减号“-”开头。 无论是哪一种情况,开始部分后面都跟着两个 斜杠“//”及DTD所有者的名称。在这个名称之后 又是两个斜杠“//”,再然后是DTD所描述的文件 的类型。最后,在又一对斜杠之后是语言的种类。
<联系人列表> XML名称 <联系人 编号=“1"> <姓名>张三</姓名> <EMAIL>zhang@</EMAIL> </联系人> <联系人 编号=“2"> <姓名>李四</姓名> <EMAIL>li@</EMAIL> </联系人> </联系人列表>
不是有效的
4. IDREF、IDREFS类型
内部DTD文档放在 XML声明之后 或在处理指令后,但 在数据之前
外部DTD文件应用示例
DTD
• <!ELEMENT演示:示例(D, E))> A (B | C | 3
属性声明
• 使用 0 宽度和类型 CDATA 将 rectangle 元素定义为空元素
<!ELEMENT rectangle EMPTY> <!ATTLIST rectangle width CDATA "0"> ENTITY and ENTITIES ID 和 IDREF 属性类型 NMTOKEN、NMTOKENS IDREFS 属性类型 ENTITY 和 ENTITIES <!ATTLIST Data Authorised_Users attribute-type #REQUIRED> <!ATTLIST element-name attribute-name NMTOKENS#IMPLIED> <!ATTLIST element-name attribute-name attribute-typedefault-value> <!ATTLIST element-name attribute-name (eval|eval|..) #FIXED "value"> attribute_name attribute-type "default-value"> CDATA #IMPLIED> <Data SECURITY= “ON” Authorised_Users= "Tom"> <!ATTLIST Topic Topicid ID #REQUIRED> ... . . . <!ATTLIST A a ENTITY #IMPLIED> ... <!ATTLIST Topic Topicid #IMPLIED> Prev IDREF #IMPLIED> <!ATTLIST A b ENTITIES ID #REQUIRED> 元素提供 Topic 元素的 ID </Data> <Topic Topicid= "Topic4"> <!ATTLIST Topic Next IDREF #IMPLIED> Prev ... 用于指定任何有效的一个或 枚举属性值 必需的属性值 固定属性值 默认属性值 <!ATTLIST XML 隐含的属性值 ... 此 Topic 为 Topic Next IDREF #IMPLIED> 多个 XML 名称 Prev 和 Next 属性指向另一 这些属性指向以未解析实体 </Topic> Topic Xrefs IDREFS #IMPLIED> <!ATTLIST 形式存在的外部数据 个元素的 ID ... 该属性将多个元素 ID 作为它的值
《XML实用教程》
《XML 实用教程》教案第1章 引论教学目的和要求:了解标记语言的发展现状,掌握XML 的特点,理解XML 的应用前景,掌握XML 文档的数据结构和基本语法,了解XML 开发工具,学会使用一种综合性工具。
重点:XML 的基本结构与语法 教学内容:1、标记语言的发展2、XML 的特点和应用前景3、XML 文档的数据结构4、XML 的开发与应用环境第1节 标记语言的发展标记语言:就是使用文字串或标记来界定和描述数据的语言。
换句话说标记语言就是描述文档内容如何显示的语言。
XML 和我们熟悉的HTML 都是一种标记语言。
他们都是由SGML (标准通用标记语言)发展而来的。
一、SGML 的起源1、SGML 产生的背景:IBM ,GML ,SGML2、SGML 的特点:SGML 实际是一种通用的文档结构描述的符号化语言,主要用来定义SGML 标准通用标记语言HTML 超文本标记语言XML 可扩展标记语言文档模型的逻辑和物理结构,可以做到“一次建设、多次使用”3、SGML语言文件的组成:语法定义、文档类型定义(DTD)、文档实例二、HTML的出现HTML:超文本标记语言,以标记来定义或描述数据的显示格式,而标记本身是没有语义的。
例:一个HTML实例<html><head><meta http-equiv=content-type="text/html;charset=gb2312"><title>这是一个HTML实例</title></head><body><h1 align=center>大家好,欢迎大家学习网页制作技术</h1>我们要学习:<br><ul><li>HTML技术</li><li>XML技术</li></ul><font color=red size=4>如果你在学习中遇到什么困难,请和我联系</font></body></html>HTML的特点:简单易学,使用方便,功能有限,可扩展性差三、XML的诞生1、1998年1月,W3C推出了XML 1.0 ,并公布了XML的组成部分:●XML的句法;●XLL(可扩展链接语言)XML的语句链接;●XSL(可扩展类型语言)XML的表现形式。
第三章 XML文件的解析
7
什么是 SAX
读取和操纵 XML 文件的标准方法是 DOM(“文 DOM( 档对象模型” 档对象模型”)。这种方法需要读取整个文件并 将它存储到树结构中,资源占用较高。 Simple API for XML 或 SAX 允许正在读取文档时 处理该文档,这避免了在采取操作之前需要等待 存储文档的所有内容。 SAX 是由 XML-DEV 邮件列表的成员开发的, XMLJava 版本由 David egginson 维护。他们的目的是提 供一种更自然的方法来使用 XML,这种方法不会 XML,这种方法不会 涉及到使用 DOM 的那种开销。
4
为何使用非验证解析器? 为何使用非验证解析器?
速度和效率。要一个 XML 解析器处理 DTD 并确保每个 XML 的元素符合在 DTD 中的规则需要相当大的开销。如果确定一 个 XML 文档是有效的(可能来自一个数据 文档是有效的( 源),那就没有必要再次验证它了。 有时只是从一个文档中找出 XML 的标记。 一旦有了这些标记,就可以将数据从中提 取出然后加以处理。这时只需要一个非验 证解析器。
... import org.xml.sax.InputSource; ... xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(new SurveyReader()); InputSource source = new InputSource("surveys.xml"); xmlReader.parse(source); } catch (Exception e) { ...
11
设置内容处理程序
创建了解析器,则需要将 SurveyReader 设置 为内容处理程序,以便于其接收事件。 xmlReader 的 setContentHandler() 方法完成这 项工作。
第三章之DTD规范
2. 在xml文档中引用外部DTD文件
在XML文件中引用外部DTD文件的基本格式如 下: <?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE 根元素名 SYSTEM "外部DTD文件名"> ……
引用外部DTD文件示例
<?xml version="1.0" encoding="gb2312" ?> <!DOCTYPE 职工列表 SYSTEM “3.2.dtd"> <客户名单>
例题3.4.xml
3.包含混合内容的约束
混合内容既可以为空,也可能只包含子元 素,也可能是字符数据(#PCDATA),或 者是既有字符数据又有子元素的混合形式。 注意:混合内容只能约束可以有哪些子标 记,不能约束这些子标记出现的次数和出 现的顺序,另外,约束条件中也不能使用 限制符号
4.EMPTY和ANY
有效的XML文件概述
对XML的数据结构进行限制有两种方式: 使用文档类型定义(Document Type Definition,DTD)和XML Schema模式。
一个规范的XML文件如果和某个DTD文 件相关联,并遵守该DTD文件规定的约束 条件,就称之为有效的XML文件。
03_1文档类型定义(DTD)
3.11
3内部 内部DTD和外部 和外部DTD的联合使用 内部 和外部 的联合使用
在实际的应用过程中, 通常是由XML文档的设计团 在实际的应用过程中 , 通常是由 文档的设计团 队提供一份公共的DTD文件作为外部 文件作为外部DTD, 然后每 队提供一份公共的 文件作为外部 , 个成员根据实际使用的需要, 通过内部DTD的声明 个成员根据实际使用的需要 , 通过内部 的声明 扩展DTD的定义 。 如果内部 的定义。 和外部DTD在标记 扩展 的定义 如果内部DTD和外部 和外部 在标记 的定义和文档的结构定义等方面发生冲突的话, 的定义和文档的结构定义等方面发生冲突的话,以内 的定义为准。 部DTD的定义为准。 的定义为准
3.15
(2)空元素 )
所谓的空元素就是只有起始标记没有结束标记的元素 所谓的空元素就是只有起始标记没有结束标记的元素 只有起始标记没有结束标记 元素的内容为空。在空元素的结束部分要用“ ” ,元素的内容为空。在空元素的结束部分要用“/>” 将元素标记写成闭合的形式。 将元素标记写成闭合的形式。 在DTD中,空元素的声明格式如下: 中 空元素的声明格式如下: <!ELEMENT 元素名 EMPTY>
]> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Member [ <!ELEMENT Member (Name, Tel, Email)> <!ELEMENT Name (#PCDATA)> <!ELEMENT Tel (#PCDATA)> <!ELEMENT Email (#PCDATA)> <!ENTITY Tel "123456"> <!ENTITY Email "XXX@"> <Member> <Name>Pipo</Name> <Tel>&Tel;</Tel> <Email>&Email;</Email> </Member>
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ENTITY、ENTITIES类型
实体在XML中充当着别名的角色。实体最根本的 作用是帮助你为一大段文本或者不能解析的实体 创建一个别名,这样,在文件的另一个位置需要 引用这段文本时,仅需要指向它的别名就可以了。 它还意味着一旦需要修改,仅需要在一个地方作 改动,就完成了全局的改动。 例如 书65页 ENTITLES类型其属性值可以包含数个以空格隔 开的未解析实体名称 例如 书65页
Page 21
3.2.3 元素声明综合示例
1.灵活控制元素出现次数 2.元素的分组与嵌套
Page 22
3.3 DTD对属性的声明
3.3.1 属性声明的语法
语法: <! ATTLIST Element_Name Attribute_Name Type [added_declare] Attribute_Name Type [added_declare] ...... >
Page 9
在DTD中可以包含下列各种声明语句:
DTD声明开始语句 元素类型声明语句 属性列表声明语句 实体声明语句 注释语句
Page 10
3.2 DTD对元素的声明
3.2.1 元素声明的语法
语法: <!ELEMENT element_name element_definition> 说明:
<!ELEMENT: 元素声明语句的开始, 关键字ELEMENT必须大写。 element_name: 所声明的元素名称。 element_definition:对该元素内容的定义, 用来规定该元素可以包含的内容。
Page 33
正是用为NMTOKEN类型的属性对于字符的严格 要求,使得它在一些常用的编程语言中,都是合 法的数据,这就为这些编程语言对xml文档数据 的操作打下了良好的基础。 NMTOKENS类型的属性具有与NMTOKEN属 性相近的形式。这种类型的属性可以使属性由若 干xml名称组成,彼此间由空格隔开。通常可为 使用NMTOKEN属性相同的情况而使用 NMTOKENS属性,但仅仅在需要多个名字的时 候。 例如 书66页
在一份DTD中,包含了对XML文档所使用 的元素、元素间的关系、元素可用的属性、 可使用的实体等的定义规则。一份DTD实 际上是若干条有关元素、属性、实体等定 义和声明语句的集合。 书中的DTDDemo_01.xml是一个包含内部 DTD声明的完整XML文档。
Page 5
验证XML有效性
根据能否对XML文档进行约束模式校验, 可以将解析器分为两类: 1.非校验解析器,如IE 2.校验解析器
第3章 使用DTD规范XML文档
3.1
DTD基本概念 DTD对元素的声明 DTD对属性的声明 DTD的引用 实体的声明与引用
3.2
3.3
3.4
3.5
3.6
Page 1
XML Schema简介
3.1 DTD基本概念
3.1.1 DTD简介
对XML文档所作的规范和约定被称为DTD, 也就是文档类型定义。可以把DTD看作是 编写某类XML文档的一个模板。
Page 19
要宣告混合内容的元素型态,你可以使用下列两 种内容模型格式的任何一种: 1 只有字符数据 。要宣告只包含字符数据的元 素型态,使用内容模型(#PCDATA)。例如, 下面的宣告让SUBTITLE 元素只能包含字符数据: <!ELEMENT SUBTITLE (#PCDATA)> 根据这个宣告,下面两个元素都是有效的: <SUBTITLE>A New Approach</SUBTITLE> <SUBTITLE></SUBTITLE>
<!DOCTYPE 书架 SYSTEM “book.dtd">
2 DTD文件在网络上:<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD的路径URL"> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "/dtds/struts-2.3.dtd">
Page 20
字符数据加上额外的子元素 。要宣告一个可以 包含字符数据加上零个或多个子元素的元素型态, 在内容模型中将每一个子元素列在#PCDATA 之 后,利用[ | ]字符来分隔每个项目,并在整个内 容模型之后加入星号( * )。在内容模型中每一个 元素的名称只能出现一次。例如,下面的宣告允 许TITLE 元素可以包含字符数据,另外加上零 或多个SUBTITLE 子元素: <!ELEMENT TITLE (#PCDATA |SUBTITLE)*>
Page 18
7.混合型元素的声明
如果元素拥有混合的内容,它可以包含字 符数据。而且如果你在宣告中设定一个或 多个子元素型态,它可以包含那些子元素 的任何一个,以任何的顺序,以及任何次 数的重复(零或多个)。换言之,利用混 合内容你可以限制子元素的型态,但你无 法限制子元素型态出现的顺序或次数,也 不能强制特定子元素型态。
Page 6
编程校验XML文档的正确性
IE5以上的浏览器内置了XML解析工具: Microsof.XMLDOM,开发人员可以编写JavaScript代码, 利用这个解析工具装载XML文件,并对XML文件进行 DTD验证。 1.创建XML文档解析器对象 var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); 2.开启XML校验 xmldoc.validateOnParse="true"; 3.装载XML文档 xmldoc.load(“book.xml"); 4.获取错误信息 var reson = xmldoc.parseError.reason; var line = xmldoc.parseError.line;
Page 24
3.3.2 属性的附加声明
1.#REQUIRED
表示在相应的XML文档中该元素的这个属 性是必须的,并必须给出一个属性值。 2.#IMPLIED 表示在XML文档中该元素的这个属性是可 有可无的。
Page 25
3.#FIXED AttValue
表示在XML文档中该元素的这个属性值是 所给定的固定值,不能更改。 4.Default_Value 在属性的附加声明中如果直接给定一个用 引号括起来的字符串,表示预设的默认属 性值。
Page 23
说明: <!ATTLIST:表示属性定义语句的开始, ATTLIST是关键字,必须大写。 Element_Name:元素名,用来指定对该元素的 属性进行声明。 Attribute_Name:该元素具有的某个属性名, 属性的命名规则与元素的命名规则是一致的。 Type:属性的数据类型。 added_declare:属性的附加声明,是一个可选 项。
例:<!ELEMENT TITLE (#PCDATA)>
Page 11
3.2.2 各种元素的声明
1.基本字符元素的声明 2.含子元素的严格声明 3.包含任意内容的声明 4.子元素出现次数的声明 5.选择性子元素的声明 6.空元素的声明 7.混合型元素的声明 8.实体的声明
Page 12
1.基本字符元素的声明
Page 3
DTD主要具有下列几方面的作用: 可以验证XML文档数据的有效性。 可以为某类XML文档提供统一的格式和相 同的结构。 可以保证在一定范围内,XML文档数据的 交流和共享。 应用程序设计人员根据DTD就能够知道对 应XML文档的逻辑结构,从而编写出相应 的处理应用程序。
Page 4
3.1.2 DTD的基本结构
Page 28
CDATA类型
CDATA指的是属性值为字符串 例如
<!ATTLIST 价格 货币单位 CDATA "人民币">
Page 29
ID类型
ID是用属性值的方式为文件中的某个元素 定义唯一标识的方法。
Page 30
IDREF, IDREFS类型
IDREF类型允许一个元素的属性使用文件 中的另一个元素,方法就是把那个元素 的 ID标识值作为该属性的取值。 例如 书64页 IDREFS类型的属性使用XML文档中多个元 素的ID类型的属性值规定了引用该DTD的XML 文档可使用哪些标记、父元素中能够包括哪些子 元素、各个元素出现的先后顺序、元素可包含的 属性、元素和属性值的数据类型,以及可使用的 实体及符号规则等。 DTD由许多约定和声明语句构成,这些语句可以 包含在XML文档内部,被称为内部DTD;也可 以独立保存为一个文件,而称为外部DTD。
Page 34
NOTATION类型
NOTATION类型也称为标注类型,这个类型 对于使用非XML格式的数据非常有用。
<!NOTATION 记号名 SYSTEM "URL路径名">
例如 书67页
Page 35
Enumerated类型
属性也可以被描述为一组可接受的取值的 列表,XML文件中对属性的赋值将从这个 列表中选取一个值。这类属性属于枚举类 型ENUMERATED,不过,关键字 ENUMERATED是不出现在DTD定义中的。 例如 书67-68页
Page 14
3.包含任意内容的声明
语法:<!ELEMENT 元素名称 使用规则> ANY:用于指示元素的主体内容为任意类型 <!ELEMENT 元素名称 ANY >
Page 15
4.子元素出现次数的声明
语法:<!ELEMENT 元素名称 使用规则> 语法:<!ELEMENT 元素名称 (子元素)> (子元素):指示元素中包含的子元素 用无符号、+、*、?来表示元素出现的次数(与 正则表达式一致) 1 无符号:只能出现一次 2 +:表示一次到多次,至少有一次 3 ?:0次或者1次 4 *:随便次数