第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),即不含有子元素的文本。 复合型:元素的内容含有其它元素,既有子元素。 混合型:元素的内容既有文本数据又有子元素。
- 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 *:随便次数