XML DTD与Schema约束
- 格式:doc
- 大小:76.00 KB
- 文档页数:6
schema约束语法Schema约束语法是一种用于定义和描述数据结构的语法规则。
它可以约束数据的类型、格式、关系以及数据之间的约束关系,从而保证数据的一致性和完整性。
在本文中,我们将介绍Schema约束语法的基本概念和用法,并通过实例来说明其在实际应用中的作用。
一、Schema约束语法的基本概念1.1 数据类型在Schema约束语法中,可以定义各种数据类型,如字符串、数字、布尔值等。
每个数据类型都有相应的约束条件,用于限制数据的取值范围。
1.2 数据格式除了数据类型,Schema约束语法还可以定义数据的格式,如日期、时间、邮箱等。
通过定义数据格式,可以确保数据的正确性和合法性。
1.3 数据关系Schema约束语法可以定义数据之间的关系,如一对一、一对多、多对多等。
通过定义数据关系,可以建立数据之间的连接和关联,从而方便数据的查询和操作。
1.4 数据约束除了数据类型、格式和关系,Schema约束语法还可以定义数据的约束条件,如唯一性、非空性等。
通过定义数据约束,可以保证数据的一致性和完整性。
二、Schema约束语法的用法2.1 定义Schema在使用Schema约束语法时,首先需要定义Schema,即数据结构的描述。
Schema可以包括表、字段、索引等信息,用于描述数据的组织和结构。
2.2 定义字段在定义Schema时,需要为每个字段指定数据类型、格式和约束条件。
字段可以是简单类型,也可以是复合类型,如数组、对象等。
2.3 定义关系在定义Schema时,需要指定数据之间的关系。
可以通过定义外键、引用等方式来建立数据之间的连接和关联。
2.4 定义约束在定义Schema时,可以为数据设置各种约束条件,如唯一性约束、非空性约束等。
这些约束条件可以保证数据的一致性和完整性。
三、Schema约束语法的实际应用3.1 数据库设计在数据库设计中,Schema约束语法可以用于定义数据库的表结构、字段类型、关系等。
什么是XML SchemaXML Schema如同DTD一样是负责定义和描述XML文档的结构和内容模式。
它可以定义XML文档中存在哪些元素和元素之间的关系,并且可以定义元素和属性的数据类型。
XML Schema本身是一个XML文档,它符合XML语法结构。
可以用通用的XML解析器解析它。
为什么要使用Schema我们前面已经使用DTD来定义一个XML的结构和数据类型,那为什么还要Schema呢?因DTD有着不少缺陷:1) DTD是基于正则表达式的,描述能力有限;2) DTD没有数据类型的支持,在大多数应用环境下能力不足;3) DTD的约束定义能力不足,无法对XML实例文档作出更细致的语义限制;4) DTD的结构不够结构化,重用的代价相对较高;5) DTD并非使用XML作为描述手段,而DTD的构建和访问并没有标准的编程接口,无法使用标准的编程方式进行DTD维护。
而XML Schema正是针对这些DTD的缺点而设计的,XML Schema的优点:1) XML Schema基于XML,没有专门的语法2) XML可以象其他XML文件一样解析和处理3) XML Schema支持一系列的数据类型(int、float、Boolean、date等)4) XML Schema提供可扩充的数据模型。
5) XML Schema支持综合命名空间6) XML Schema支持属性组。
一个简单的XML Schema文档在这个Schema里面定义了一个元素:quantity,它的类型是nonNegativeInteger(非负整数),xmlns是Schema的命名空间,这在前面第3章已经叙述过了。
下面的XML片段是合法的:<quantity>5</quantity>下面的XML片段是非法的:<quantity>-4</quantiy><quantity>some</quantity>Schema中的类型Schema中主要包括三种部件:元素(element)、属性(attribute)、注释(notation)。
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();}}}。
dtd和schema的区别在XML技术⾥,可以编写⼀个⽂档来约束⼀个XML⽂档的书写规范,这称之为XML约束。
常⽤的约束技术XML DTD ;XML Schema。
XML Schema 也是⼀种⽤于定义和描述 XML ⽂档结构与内容的模式语⾔,其出现是为了克服 DTD 的局限性XML Schema VS DTD:XML Schema符合XML语法结构。
DOM、SAX等XML API很容易解析出XML Schema⽂档中的内容。
XML Schema对名称空间⽀持得⾮常好。
XML Schema⽐XML DTD⽀持更多的数据类型,并⽀持⽤户⾃定义新的数据类型。
XML Schema定义约束的能⼒⾮常强⼤,可以对XML实例⽂档作出细致的语义限制。
XML Schema不能像DTD⼀样定义实体,⽐DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。
DTD(Document Type Definition),全称为⽂档类型定义。
XML⽂件使⽤ DOCTYPE 声明语句来指明它所遵循的DTD⽂件,DOCTYPE声明语句有两种形式:⼀、当引⽤的⽂件在本地时,采⽤如下⽅式:<!DOCTYPE ⽂档根结点 SYSTEM "DTD⽂件的URL">例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>。
在xml⽂件中⼿写⼀下。
⼆、当引⽤的⽂件是⼀个公共的⽂件时,采⽤如下⽅式:<!DOCTYPE ⽂档根结点 PUBLIC "DTD名称" "DTD⽂件的URL">DTD语法:元素定义、属性定义、实体定义。
声明⼀个XML元素——<!ELEMENT 元素名称元素类型>元素类型可以是元素内容、或类型<!ELEMENT >在元素内容中也可以使⽤+、*、?等符号表⽰元素出现的次数:+: ⼀次或多次 (书+): 0次或⼀次 (书?)*: 0次或多次 (书*)xml⽂档中的标签属性需通过ATTLIST为其设置属性语法格式:<!ATTLIST 元素名属性名1 属性值类型设置说明属性名2 属性值类型设置说明……>设置说明:#REQUIRED:必须设置该属性#IMPLIED:可以设置也可以不设置#FIXED:说明该属性的取值固定为⼀个值,在 XML ⽂件中不能为该属性设置其它值。
Schema和DTD的区别
Schema是对XML文档结构的定义和描述,其主要的作用是用来约束XML文件,并验证XML文件有效性。
DTD的作用是定义XML 的合法构建模块,它使用一系列的合法元素来定义文档结构。
它们之间的区别有下面几点:
1、Schema本身也是XML文档,DTD定义跟XML没有什么关系,Schema在理解和实际应用有很多的好处。
2、DTD文档的结构是“平铺型”的,如果定义复杂的XML文档,很难把握各元素之间的嵌套关系;Schema文档结构性强,各元素之间的嵌套关系非常直观。
3、DTD只能指定元素含有文本,不能定义元素文本的具体类型,如字符型、整型、日期型、自定义类型等。
Schema在这方面比DTD 强大。
4、Schema支持元素节点顺序的描述,DTD没有提供无序情况的描述,要定义无序必需穷举排列的所有情况。
Schema可以利用xs:all 来表示无序的情况。
5、对命名空间的支持。
DTD无法利用XML的命名空间,Schema很好满足命名空间。
并且,Schema还提供了include和import两种引用命名空间的方法。
前面提到过的, DTD ( Document Type Definition ,文档类型定义)就是定义 XML 文档中元素的结构和内容等。
其实 DTD 就相当于 XML 中的“词汇”和“语法”,不同的行业可以定义自己的“词汇”和“语法”,以利于解析器验证 XML 文档的有效性,并且这样也利于行业中和行业之间的交流。
就相当于只有当两个人对各自说出的词汇都理解对方的时候才能有顺利的交流。
这其实就是对 XML 文档使用元素的定义的以层抽象,把它的定义独立出一个文件,以利于对信息的隐藏和扩展。
这也可以把它想象成程序语言,比如 C# 中的接口的定义。
把 DTD 文件想象成一个接口,而引用这个 DTD 文件的 XML 文档是这个接口的实现类,只要了解了这个 DTD 文件,就大致知道了和这个 DTD 文件相链接的 XML 文档的一些框架信息。
DTD 文件也可以看成是一系列 XML 文档的模板,它定义了相关 XML 文档的元素,属性,排列方式(元素,属性等),元素的内容类型,以及元素的层次结构等。
DTD 中元素的声明<;!ELEMENT 元素名(元素描述) >;这里主要介绍元素描述,元素的描述包含两部分:1. 如果元素是简单元素,即该元素不包含子元素,则描述部分是针对该元素的内容的限制或是规定。
这种限制的描述可以是:#PCDATA :元素的内容只能是可解析的文本数据。
<;!ELEMENT 元素名 (#PCDATA)>;EMPTY :元素内容必须为空,但可以包含属性。
<; ! ELEMENT 元素名 EMPTY>;2. 如果元素是复杂元素,即该元素包含子元素,则元素描述包含对子元素名的列表(可用正则表达式表达)。
元素描述的括号表示内容描述的组合。
<;!ELEMENT book(title, author+, summary | content)>;正则表达式用法:( ) 给元素分组(A | B | C), (D | E), F| 在列出的对象中选择一个 (A | B)* 对象允许出现 0 到多次 (A*)+ 对象应出现 1 到多次 (A+)对象可以出现 0 到 1 次 (A?), 对象以指定顺序出现(A, B, C)同时,如果不能确定一个元素是否含有子元素或是只能包含文本,那么可以将元素定义为混合类型的。
xml中schema的作⽤⼀什么是schema (模式)1 XML Schema 的作⽤是定义 XML ⽂档的合法构建模块,类似 DTD。
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML ⽂档的结构。
XML Schema 语⾔也称作 XML Schema 定义(XML Schema Definition,XSD)。
2 XML Schema:定义可出现在⽂档中的元素定义可出现在⽂档中的属性,定义哪个元素是⼦元素,定义⼦元素的次序,定义⼦元素的数⽬定义元素是否为空,或者是否可包含⽂本,定义元素和属性的数据类型,定义元素和属性的默认值以及固定值3 xml schema的优势XML Schema 可针对未来的需求进⾏扩展,XML Schema 更完善,功能更强⼤,XML Schema 基于 XML 编写,,XML Schema ⽀持数据类型,XML Schema ⽀持命名空间4 XML Schema 是 W3C 标准。
⼆,DTD 与 XML Schema 引⽤的异同 DTD<?xml version="1.0"?><!DOCTYPE note SYSTEM "/dtd/note.dtd"><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>XML Schema<?xml version="1.0"?><xs:schema xmlns:xs="/2001/XMLSchema"targetNamespace=""xmlns=""elementFormDefault="qualified">......</xs:schema>xmlns:xs="/2001/XMLSchema"的含义显⽰ schema 中⽤到的元素和数据类型来⾃命名空间 "/2001/XMLSchema"。
xml约束详解XML(Extensible Markup Language)即扩展标记语言,是一种用于存储和传输数据的标准格式。
XML约束是XML语言中非常重要的一部分,它规定了XML文档中元素的结构和内容,保证了XML文档的正确性和规范性。
下面,我们来详细了解一下XML约束。
一、XML约束的作用XML约束用于定义XML文档中元素的结构和内容约束规则。
它通过定义DTD(Document Type Definition)、XML Schema等方式来限制XML文档中元素的使用方式、元素之间的关系以及元素的属性等。
XML约束的作用主要体现在以下几个方面:1.保证XML文档的正确性和规范性:XML约束可以检查XML文档的语法、结构和内容是否符合要求,保证XML文档的正确性和规范性。
2.提高XML文档的可读性和可维护性:使用XML约束可以使XML文档更易阅读和理解,也更容易维护和更新。
3.方便XML文档的共享和交换:XML约束提供了一种标准的数据交换格式,可以方便地实现XML数据的共享和交换。
XML约束主要分为DTD和XML Schema两种,它们分别具有不同的特点和使用场景。
1.DTDDTD约束有以下特点:(1)DTD语法简单:DTD使用的语法比较简单,易于掌握和使用。
(2)不支持数据类型:DTD不支持数据类型,无法限制元素或属性的数据类型。
(3)不支持命名空间:DTD不支持命名空间,对于复杂的XML文档结构,使用DTD可能会导致一些约束问题。
2.XML SchemaXML Schema是一种更为严格的约束方式,它是一种XML文档定义语言,用于定义XML 文档中元素、属性、数据类型和约束规则等。
它是目前被广泛应用的XML约束方式之一,比较完善和强大。
(1)支持数据类型:XML Schema支持数据类型,并可以定义自定义数据类型。
(2)支持命名空间:XML Schema支持命名空间,可以很好地处理复杂的XML文档结构。
XML DTD与Schema约束一、【引言】Xml即Extensible Markup Language可扩展标记语言。
它是由SGML(Standard Gerneralized Markup language)发展而来的,允许开发者自定标签,可以将标签和内容有效的分离。
在XML技术里,可以编写一个文档来约束XML文档的书写规范,称之为XML约束。
二、【DTD (Document Type Definition)】DTD是一种比较早起的xml约束方式,在表达属性值和元素内容的类型约束上存在很多缺陷。
1、DTD的两种约束方式DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写。
(1)、在xml文件内编写DTD1.<?xml version="1.0"encoding="UTF-8"standalone="yes"?>2.<!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)>3.<!ELEMENT 书 (书名,作者,售价)>4.<!ELEMENT 书名 (#PCDATA)>5.<!ELEMENT 作者 (#PCDATA)>6.<!ELEMENT 售价 (#PCDATA)> ]>7.<书架>8.<书>9.<书名>Java就业培训教程</书名>10.<作者>张孝祥</作者>11.<售价>39.00元</售价>12.</书>13.</书架>(2)、引用DTD约束XML文件使用DOCTYPE 声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:A、当引用的文件在本地时,采用如下方式:1.<!DOCTYPE 文档根结点SYSTEM "DTD文件的URL">2.例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>B、当引用的文件是一个公共的文件时,采用如下方式:1.<!DOCTYPE 文档根结点PUBLIC "DTD名称" "DTD文件的URL">例如:2.<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""/dtd/web-app_2_3.dtd">2、DTD约束语法细节:(1)、DTD的语法细节:元素定义1在DTD文档中使用ELEMENT声明一个XML元素,语法格式如下所示:1.<!ELEMENT 元素名称元素类型>元素类型可以是元素内容、或类型2.如为元素内容:则需要使用()括起来,如3.<!ELEMENT 书架 (书名,作者,售价)>4.<!ELEMENT 书名 (#PCDATA)>如为元素类型,则直接书写,DTD规范定义了如下几种类型:EMPTY:用于定义空元素,例如<br/> <hr/>ANY:表示元素内容为任意类型。
(2)、DTD的语法细节:元素定义2元素内容中可以使用如下方式,描述内容的组成关系用逗号分隔,表示内容的出现顺序必须与声明时一致。
<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)> 用|分隔,表示任选其一,即多个只能出现一个<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>在元素内容中也可以使用+、*、?等符号表示元素出现的次数:+: 一次或多次(书+) ?: 0次或一次(书?)*: 0次或多次(书*)也可使用圆括号( )批量设置,例<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>(3)、属性定义xml文档中的标签属性需通过ATTLIST为其设置属性语法格式:1.<!ATTLIST 元素名属性名1 属性值类型设置说明2.属性名2 属性值类型设置说明3.……>4.属性声明举例:5.<!ATTLIST 商品类别 CDATA #REQUIRED6.颜色 CDATA #IMPLIED >对应XML文件:1.<商品类别="服装" 颜色="黄色">…</商品>2.<商品类别="服装">…</商品>设置说明:#REQUIRED:必须设置该属性#IMPLIED:可以设置也可以不设置#FIXED:说明该属性的取值固定为一个值,在XML 文件中不能为该属性设置其它值。
但需要为该属性提供这个值直接使用默认值:在XML 中可以设置该值也可以不设置该属性值。
若没设置则使用默认值。
举例:1.<!ATTLIST 页面作者2.姓名 CDATA #IMPLIED3.年龄 CDATA #IMPLIED4.联系信息 CDATA #REQUIRED5.网站职务 CDATA #FIXED "页面作者"6.个人爱好 CDATA "上网" >(4)常用属性值类型CDATA:表示属性值为普通文本字符串。
ENUMERATED,ID,ENTITY(实体)A、属性值类型——ENUMERATED属性的类型可以是一组取值的列表,在XML 文件中设置的属性值只能是这个列表中的某个值(枚举)1.<?xml version = "1.0"encoding="GB2312"standalone="yes"?>2.<!DOCTYPE 购物篮 [ <!ELEMENT 肉 EMPTY>3.<!ATTLIST 肉品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉"> ]>4.<购物篮>5.<肉品种="鱼肉"/>6.<肉品种="牛肉"/>7.<肉/>8.</购物篮>B、属性值类型——ID表示属性的设置值为一个唯一值。
ID 属性的值只能由字母,下划线开始,不能出现空白字符1.<?xml version = "1.0"encoding="GB2312"?>2.<!DOCTYPE 联系人列表[ <!ELEMENT 联系人列表 ANY>3.<!ELEMENT 联系人(姓名,EMAIL)>4.<!ELEMENT 姓名(#PCDATA)>5.<!ELEMENT EMAIL(#PCDATA)>6.<!ATTLIST 联系人编号 ID #REQUIRED> ]>7.<联系人列表>8.<联系人编号="1">9.<姓名>张三</姓名>10.<EMAIL>zhang@</EMAIL>11.</联系人>12.<联系人编号="2">13.<姓名>李四</姓名>14.<EMAIL>li@</EMAIL>15.</联系人>16.</联系人列表>C、实体定义——ENTITY实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
实体可分为两种类型:引用实体和参数实体。
a、实体定义——引用实体引用实体主要在XML 文档中被应用语法格式:<!ENTITY 实体名称“实体内容” >:直接转变成实体内容引用方式:&实体名称;举例:<!ENTITY copyright “I am a programmer">©right;b、实体定义——参数实体参数实体被DTD文件自身使用语法格式: <!ENTITY % 实体名称"实体内容" >引用方式:%实体名称;举例1:1.<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">2.3. <!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>4. <!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>举例2:1.<!ENTITY % common.attributes2. " id ID #IMPLIED3. account CDATA #REQUIRED "4.>5....6.<!ATTLIST purchaseOrder %common.attributes;>7.<!ATTLIST item %common.attributes;>三、【XML Schema约束】Schema与DTD完全不同,DTD使用不同于xml本身的另一套语法,而Schema自身也是一个xml 文档,同时,schema对DTD中的不足进行了不出,尤其是在表达属性值和元素内容的类型约束上。
1、根标记XML Schema模式是扩展名为“.xsd”的一个文本文件,使用XML语法来编写。
XML Schema模式的跟标记必须是schema,使用的名称空间是:/2001/XMLSchema名称空间的前缀xsd。
例如:1.<xsd:schema xmlns:xsd="/2001/XMLSchema">2. ....3.</xsd:shema>2、元素标记XML Schema模式的主要目的是约束XML文件中的标记。
XML Schema模式用“element”标记来约束XML 中的标记。
可以将“element”标记作为XML Schema模式中根标记的子标记来使用,XML Schema模式中的“element”标记简称为元素。
若元素是根标记的子标记,这样的元素称为全局元素,全局元素的作用是约束XML文件中任何级别上的子标记,而无论该XML标记是XML文件中的哪一级子标记。