【Schema详解】

    xiaoxiao2025-03-24  40

    目录

    前言Schemabook.xsd文档解析< schema > 元素简单的类型XSD 简易元素XSD 属性XSD 限定 / Facets XSD复合元素不懂请看例题 book.xml文档解析 总结

    前言

    |ू・ω・` ) 首先,本章节主要是在【XML之DTD】之后写的一个跟DTD可以替换来用的XML schema

    因为DTD虽然可以解决目前的小的问题,可DTD相对Schema来说还是有点力有不足 为了让大家学会能学会Schema,我也去查阅了许多的资料。

    在本章中我会将一个xsd实列来讲个大家听,并且简单分析,然后给大家看如何使用xsd约束xml文件

    废话不多说,lego

    Schema

    立场:W3C于2001年5月正式推荐XML Schema为XML 的标准模式,W3C希望以XML Schema来作为XML模式描述语言的主流,并逐渐代替XML DTD。 ps:(W3c)万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构

    概念:

    XML是一种可扩展标记语言,用于标记电子文件使其具有结构性的标记语言可以用来标记数据、定义数据类型是一种允许用户对自己的标记语言进行定义的源语言可扩展标记语言是标准通用标记语言的子集,非常适合 Web 传输。

    为了大家理解:

    book.xsd文档解析

    我会讲个xsd文档的组成,然后如何运用xml文件来限制。

    < schema > 元素

    元素是每一个 XML Schema 的根元素

    <?xml version="1.0"?> <xs:schema> ... ... </xs:schema>

    < shema >有自己的属性: 上面有详细注释;可以看看理解


    不懂我再来:

    xmlns:xs="http://www.w3.org/2001/XMLSchema"

    显示 schema 中用到的元素和数据类型来自命名空间 “http://www.w3.org/2001/XMLSchema”。同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xs:

    targetNamespace="http://www.example.org/book"

    schema 定义的元素 来自命名空间: “http://www.example.org/book”

    xmlns="http://www.example.org/book"

    若没有前缀的话就是默认命名空间

    elementFormDefault="qualified"

    schema 中声明过的元素必须被命名空间限定。


    简单的类型

    XSD 简易元素

    什么是简易元素?

    简易元素指那些仅包含文本的元素。它不会包含任何其他的元素或属性。

    语法:

    <xs:element name="xxx" type="yyy"/>//xs是命名的空间里取得

    xxx 指元素的名称,yyy 指元素的数据类型

    xs:stringxs:decimalxs:integerxs:booleanxs:datexs:time

    例如: schema定义:

    <xs:element name="name" type="xs:string"/> <xs:element name="age" type="xs:integer"/>

    XML 元素:

    <name>"aa"</name> <age>28</age>

    XSD 属性

    概念:所有的属性均作为简易类型来声明。

    !!!注意:简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型

    定义属性的语法:

    <xs:attribute name="xxx" type="yyy"/>

    比如: XML 元素:

    <name lang="EN">Smith</name>

    定义:

    <xs:attribute name="lang" type="xs:string"/>

    XSD 限定 / Facets

    概念:限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。

    限定就暂时就讲 :对一个值的限定 和 对一组值得限定 对一个值的限定: 下面的例子定义了带有一个限定且名为 “age” 的元素。age 的值不能低于 0 或者高于 120:

    <xs:element name="age"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="120"/> </xs:restriction> </xs:simpleType> </xs:element>

    对一组值得限定: 下面的例子定义了带有一个限定的名为 “car” 的元素。可接受的值只有:a, b c:

    <xs:element name="car"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="a"/> <xs:enumeration value="b"/> <xs:enumeration value="c"/> </xs:restriction> </xs:simpleType> </xs:element>

    XSD复合元素

    复合元素指包含其他元素及/或属性的 XML 元素。

    有四种类型的复合元素:

    空元素

    复合元素,“product”,是空的

    <product pid="1345"/> 包含其他元素的元素

    复合元素,“employee”,仅包含其他元素:

    <employee> <firstname>John</firstname> <lastname>Smith</lastname> </employee> 仅包含文本的元素

    复合元素,“food”,仅包含文本:

    <food type="dessert">Ice cream</food> 包含元素和文本的元素

    复合元素,“description”,包含元素和文本:

    <description> It happened on <date lang="norwegian">03.03.99</date> .... </description>

    如何定义:

    不懂请看例题

    写了一个简单的xsd限制,当然去参考了其他博主的代码


    book.xml文档解析

    上面已经有了个book.xsd文件来约束xml所以细微讲解一下,如何使用book.xsd文件

    http://www.w3.org/2001/XMLSchema-instance 是一个固定值,这个URI指向一个xsd文档,该xsd的targetNamespace的值就是这个URI。

    xsi:schemaLocation的作用:

    其语法是:schemaLocation=“{namespaceURI} {xsd名称}”

    只要与约束的一样就不会有什么问题

    当然也可以在xmlns后加命名空间的前缀,在该前缀修饰的元素需要遵循该schema的规范。


    总结

    在我看来:XML Schema比XML DTD具有更强的表现力,特别是一些复杂的构造更加的好用些。

    其他大触:ML Schema虽然在大多数的应用领域都有替代XML DTD的趋势,但是XML DTD仍然有它的适用范围,并不可能被XML Schema完全替代

    Thanks♪(・ω・)ノ希望大家能用来参考

    最新回复(0)