xml、dtd、xsd
-
xml:
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 被设计用来传输和存储数据。
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 文档形成一种树结构 -
xml的语法规则
所有 XML 元素都须有关闭标签
XML 标签对大小写敏感
XML 元素使用 XML 标签进行定义。
XML 标签对大小写敏感。在 XML 中,标签 与标签 是不同的。
必须使用相同的大小写来编写打开标签和关闭标签
XML 必须正确地嵌套
XML 文档必须有根元素
XML 的属性值须加引号
实体引用: 在 XML 中,一些字符拥有特殊的意义。如果你把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
在 XML 中,空格会被保留 -
dtd: (Document Type Definition)
可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。主要用来限制xml的元素格式的
DTD 可被成行地声明于 XML 文档中(),也可作为一个外部引用() -
xsd:
XML Schema 是基于 XML 的 DTD 替代者。XML Schema 是 DTD 的继任者
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
理由如下:
XML Schema 可针对未来的需求进行扩展
XML Schema 更完善,功能更强大
XML Schema 基于 XML 编写
XML Schema 支持数据类型
XML Schema 支持命名空间
dtd例子:
// 外部dtd students.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT students (student+)>
<!ELEMENT student (name, age, score)>
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT score (#PCDATA) >
<!ATTLIST student id ID #REQUIRED>
// students_inner_dtd.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- +(最少出现一次) *(出现零次或多次) ?(出现零次或一次) (|)(非.../既...)-->
<!DOCTYPE students [
<!ELEMENT students (student+)>
<!ELEMENT student (name, age, score)>
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT score (#PCDATA) >
<!ATTLIST student id ID #REQUIRED>
]>
<students>
<student id="zhangsans">
<name>zhangsan</name>
<age>20</age>
<score>99</score>
</student>
<student id="lisi">
<name>zhangsan</name>
<age>20</age>
<score>99</score>
</student>
</students>
// students_outer_dtd.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "http://students/dtd/students.dtd">
<students>
<student id="zhangsan">
<name>zhangsan</name>
<age>20</age>
<score>99</score>
</student>
</students>
如何将外部的dtd通过eclipse引入到项目中
xsd例子:
// Vehicle_1.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://fuckyou/Version"
elementFormDefault="qualified">
<!-- xmlns表示默认命名空间,也就是说在这个文件中,没有加前缀的元素都在这个命名空间的,默认添加了命名空间
例如: schema/element/NCName等都是默认命名空间中的元素,属于基础schema的,且这个命名空间中的内容不可以增加-->
<!-- targetNamespace表示当前文件中定义的element对外的命名空间 -->
<!-- 创建xsd文件的时候,首个文件必须要引用http://www.w3.org/2001/XMLSchema,这是一个基础Schema -->
<element name="Vehicle" >
<complexType>
<sequence>
<element name="color" form="unqualified" type="NCName"></element>
<element name="wheels" form="unqualified" type="integer"></element>
<element name="seats" form="unqualified" type="integer"></element>
</sequence>
</complexType>
</element>
</schema>
// Vehicle_2.xsd
<?xml version="1.0" encoding="UTF-8"?>
<ss:schema xmlns:ss="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://fuckyou/Version"
elementFormDefault="qualified">
<!-- 也可以不采用默认的命名空间,而是使用指定的命名空间ss,那么文件中的默认命名空间 就没有什么用了
就像当前文件中,根schema采用的是前缀方式,那么当前文件中不可能存在默认的命名空间元素了,但是可以出现其他前缀的元素-->
<ss:element name="Vehicle">
<ss:complexType>
<ss:sequence>
<ss:element name="color" form="unqualified" type="ss:NCName"></ss:element>
<ss:element name="wheels" form="unqualified" type="ss:integer"></ss:element>
<ss:element name="seats" form="unqualified" type="ss:integer"></ss:element>
</ss:sequence>
</ss:complexType>
</ss:element>
</ss:schema>
// Vehicle_3.xsd
<?xml version="1.0" encoding="UTF-8"?>
<ss:schema xmlns:ss="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://fuckyou/Version"
elementFormDefault="qualified">
<!-- elementFormDefault:
qualified时,根元素及其下所有子元素都必须通过命名空间前缀限定目标命名空间,且这个命名空间必须是schema中定义的targetNameSpace。
unqualified时,实例xml的根元素必须有命名空间的的限定,这个命名空间必须是schema中定义的targetNameSpace。
但是其下子元素无须也不允许用命名空间前缀限定目标命名空间。 子元素的命名空间为空命名空间-->
<ss:element name="Vehicle">
<ss:complexType>
<ss:sequence>
<ss:element name="color" type="ss:NCName"></ss:element>
<ss:element name="wheels" type="ss:integer"></ss:element>
<ss:element name="seats" type="ss:integer"></ss:element>
</ss:sequence>
</ss:complexType>
</ss:element>
</ss:schema>
// Person.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:v="http://fuckyou/Version"
targetNamespace="http://fuckyou/Person" >
<!-- 此处引入了一个外部的xsd文件v,也就是说文件中前缀v表示是Version.xsd中的元素,此时需要将xsd导入 -->
<import namespace="http://fuckyou/Version"
schemaLocation="http://fuckyou/Version/v.xsd"></import>
<element name="Person">
<complexType>
<sequence>
<element name="name" form="unqualified" type="NCName" ></element>
<element name="age" form="unqualified" type="integer"></element>
<element name="height" form="unqualified" type="integer"></element>
<element ref="v:Vehicle" />
</sequence>
</complexType>
</element>
</schema>
// Person2.xsd
<?xml version="1.0" encoding="UTF-8"?>
<ss:schema xmlns:ss="http://www.w3.org/2001/XMLSchema"
xmlns:v="http://fuckyou/Version"
targetNamespace="http://fuckyou/Fuck"
xmlns="http://fuckyou/Fuck"
elementFormDefault="qualified">
<!-- 此处引入了一个外部的xsd文件v,也就是说文件中前缀v表示是Version.xsd中的元素,此时需要将xsd导入 -->
<!-- xmlns表示文件中创建的复合类型是此命名空间的,所以一般情况xmlns与 targetNamespace一致,否则提示错误 -->
<ss:import namespace="http://fuckyou/Version"
schemaLocation="http://fuckyou/Version/v.xsd"></ss:import>
<ss:element name="Person" type="personType">
</ss:element>
<ss:complexType name="personType"> <!-- 此处定义的personType的命名空间是属于默认的命名空间,如果把xmlns修改了,则会报错 -->
<ss:sequence>
<ss:element name="title" type="ss:string"></ss:element>
<ss:element name="age" type="ss:integer"></ss:element>
<ss:element name="height" type="ss:integer"></ss:element>
<ss:element ref="v:Vehicle" />
</ss:sequence>
</ss:complexType>
</ss:schema>
// Car.xml
<?xml version="1.0" encoding="UTF-8"?>
<p:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://fuckyou/Person"
xmlns:v="http://fuckyou/Version"
xsi:schemaLocation="http://fuckyou/Person http://fuckyou/Person/p.xsd">
<!-- http://www.w3.org/2001/XMLSchema-instance 这个命名空间必须引用,然后才能执行 schemaLocation操作 -->
<name>zhangsan</name>
<age>20</age>
<height>59</height>
<v:Vehicle>
<color>red</color>
<wheels>4</wheels>
<seats>4</seats>
</v:Vehicle>
</p:Person>
// Car2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Person xmlns="http://fuckyou/Fuck"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:v="http://fuckyou/Version"
xsi:schemaLocation="http://fuckyou/Fuck http://fuckyou/Fuck/p2.xsd
http://fuckyou/Version http://fuckyou/Version/v3.xsd">
<!-- 此处Person元素采用默认的命名空间,所以title元素也必有默认的命名空间,因此对应的xsd的elementFormDefault必须取"qualified"
而且Vehicle元素和子元素必须存在空间前缀,否则提示错误 -->
<title>zhangsan</title>
<age>22</age>
<height>33</height>
<v:Vehicle>
<v:color>red</v:color> <v:wheels>3</v:wheels>
<v:seats>4</v:seats>
</v:Vehicle>
</Person>
xsd引用方法:
http://blog.sina.com.cn/s/blog_3ef2364d0102vug2.html
https://blog.csdn.net/u011519892/article/details/20801569
https://www.cnblogs.com/jhxk/articles/1619105.html
http://www.runoob.com/schema/schema-dtypes-string.html