XML 学习笔记 7:XSD

本文章内容参考自:
W3school XSD 教程
Extensible Markup Language (XML) 1.0 (Second Edition)
XML Schema 2001
XML Schema Part 2: Datatypes Second Edition

文章目录


1、XSD 是什么

XSD(XML Schema Definition)用来描述 XML 文档的结构,是 DTD 的替代者,功能比 DTD 更强大。

  1. XML Schema 基于 XML 编写

    • 可扩展
    • 可以通过 XML 解析器来解析 Schema 文件
    • 可以通过 XML DOM 来处理 Schema
    • 可以通过 XSLT 来转换 Schema
  2. XML Schema 支持数据类型

    • 可更容易地验证数据的正确性
    • 可以更容易地定义数据格式
    • 可以更容易地定义数据约束(data facets)
    • 可以更容易地在不同的数据类型间转换数据

通过 XML Schema,数据的发送方可以用一种接收方能够理解的方式来描述数据。

例如 “03-11-2004”,在某些国家被解释为 11 月 3 日,而在另一些国家被解释为 3 月 11 日。

但是一个带有数据类型的 XML 元素 <date type="date">2004-03-11</date>,可以确保对数据内容的一致理解,这是因为 XML 数据类型 xs:date 要求的格式是 YYYY-MM-DD

XML Schema 在 2001 年 5 月 2 日成为 W3C 标准


2、XSD 内置数据类型 - built-in datatypes

XSD 规定 schema 的数据类型包括 44 种内置的数据类型(built-in datatypes)和用户派生的数据类型(user-derived datatypes)。

44 种内置类型包括 19 种从 anySimpleType 派生的基本类型(primitive datatypes)和 25 种从基本类型派生的派生基本类型(derived primitive types)。

19 种基本类型包括:

  • 1 种字符串类型 string
  • 3 种数值类型 decimal、float、double
  • 9 种日期时间类型 date、time、datetime、gYear、gYearMonth、gMonth、gMonthDay、gDay 以及周期类型 duration
  • 1 种布尔类型 boolean
  • 2 种编码二进制类型 base64Binary、hexBinary
  • 3 种其他类型 anyURI、QName、NOTATION

25 种派生类型又包括 12 种字符串派生类型以及 13 种数值派生类型。如下图示:

dataType

2.1、基本数据类型 19 种

2.1.1、基本字符串类型 1 种
数据类型 派生类型 限制 描述
xs:string anySimpleType 类型 whiteSpace="preserve" 字符串。XML 处理器不会做任何处理,保留空格、换行、回车以及制表符
2.1.1.1、字符串 - string 简单类型
2.1.2、基本数值类型 3 种
数据类型 派生类型 限制 描述
xs:decimal anySimpleType 类型 whiteSpace="collapse"、fixed="true" 十进制数。最大位数是 18 位。例如 -999.52
xs:float anySimpleType 类型 whiteSpace="collapse"、fixed="true" 32 位单精度浮点数
xs:double anySimpleType 类型 whiteSpace="collapse"、fixed="true" 64 位双精度浮点数
2.1.2.1、十进制数 - decimal 简单类型
2.1.2.2、单精度浮点数 - float 简单类型
2.1.2.3、双精度浮点数 - double 简单类型
2.1.3、日期时间类型 9 种
数据类型 派生类型 限制 描述
xs:date anySimpleType 类型 whiteSpace="collapse"、fixed="true" YYYY-MM-DD
xs:time anySimpleType 类型 whiteSpace="collapse"、fixed="true" hh:mm:ss
xs:dateTime anySimpleType 类型 whiteSpace="collapse"、fixed="true" YYYY-MM-DDThh:mm:ss,T 表示时间部分的起始
xs:gYear anySimpleType 类型 whiteSpace="collapse"、fixed="true" 定义日期时间的一个部分 - 年 (YYYY)
xs:gYearMonth anySimpleType 类型 whiteSpace="collapse"、fixed="true" 定义日期时间的一个部分 - 年和月 (YYYY-MM)
xs:gMonth anySimpleType 类型 whiteSpace="collapse"、fixed="true" 定义日期时间的一个部分 - 月 (MM)
xs:gMonthDay anySimpleType 类型 whiteSpace="collapse"、fixed="true" 定义日期时间的一个部分 - 月和天 (MM-DD)
xs:gDay anySimpleType 类型 whiteSpace="collapse"、fixed="true" 定义日期时间的一个部分 - 天 (DD)
xs:duration anySimpleType 类型 whiteSpace="collapse"、fixed="true" PnYnMnDTnHnMnSn 表示年月日时分秒的数目,P 表示周期,T 表示时间部分的起始。例如 P5Y2M10DT15H 表示 5 年零 2 个月零 10天 零 15 小时
2.1.3.1、日期 - date 简单类型
2.1.3.2、时间 - time 简单类型
2.1.3.3、日期时间 - dateTime 简单类型
2.1.3.4、年 - gYear 简单类型
<xs:simpleType name="gYear" id="gYear">
    <xs:annotation>
        <xs:appinfo>
            <hfp:hasFacet name="pattern"/>
            <hfp:hasFacet name="enumeration"/>
            <hfp:hasFacet name="whiteSpace"/>
            <hfp:hasFacet name="maxInclusive"/>
            <hfp:hasFacet name="maxExclusive"/>
            <hfp:hasFacet name="minInclusive"/>
            <hfp:hasFacet name="minExclusive"/>
            <hfp:hasProperty name="ordered" value="partial"/>
            <hfp:hasProperty name="bounded" value="false"/>
            <hfp:hasProperty name="cardinality" value="countably infinite"/>
            <hfp:hasProperty name="numeric" value="false"/>
        </xs:appinfo>
        <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#gYear"/>
    </xs:annotation>
    
    <xs:restriction base="xs:anySimpleType">
        <xs:whiteSpace value="collapse" fixed="true" id="gYear.whiteSpace"/>
    </xs:restriction>
</xs:simpleType>

[Definition]
gYear represents a gregorian calendar year. The ·value space· of gYear is the set of Gregorian calendar years as defined in § 5.2.1 of [ISO 8601]. Specifically, it is a set of one-year long, non-periodic instances e.g. lexical 1999 to represent the whole year 1999, independent of how many months and days this year has.

gYear 表示公历年。gYear 的值空间是 ISO 8601 中定义的一组公历年份。具体来说,它是一组一年长的非周期实例。例如词汇 1999,代表 1999 年全年,与该年的月份和天数无关。

2.1.3.5、年和月 - gYearMonth 简单类型
2.1.3.6、月 - gMonth 简单类型
2.1.3.7、月和天 - gMonthDay 简单类型
2.1.3.8、天 - gDay 简单类型
2.1.3.9、周期 - duration 简单类型
2.1.4、布尔类型 1 种
数据类型 派生类型 限制 描述
xs:boolean anySimpleType 类型 whiteSpace="collapse"、fixed="true" true 或 false
2.1.4.1、布尔 - boolean 简单类型
2.1.5、编码二进制类型 2 种
数据类型 派生类型 限制 描述
xs:base64Binary anySimpleType 类型 whiteSpace="collapse"、fixed="true" Base64 编码的二进制数据
xs:hexBinary anySimpleType 类型 whiteSpace="collapse"、fixed="true" 十六进制编码的二进制数据
2.1.5.1、Base64 编码 - base64Binary 简单类型
2.1.5.2、十六进制编码 - hexBinary 简单类型
2.1.6、其他基本数据类型 3 种
数据类型 派生类型 限制 描述
xs:anyURI anySimpleType 类型 whiteSpace="collapse"、fixed="true" 转义URI
xs:QName anySimpleType 类型 whiteSpace="collapse"、fixed="true" 命名空间名称和本地名称组成的限定名
xs:NOTATION anySimpleType 类型 whiteSpace="collapse"、fixed="true" 非 XML 格式的数据
2.1.6.1、统一资源标识符 - URI 简单类型
2.1.6.2、限定名 - QName 简单类型
<xs:simpleType name="QName" id="QName">
    <xs:annotation>
        <xs:appinfo>
            <hfp:hasFacet name="length"/>
            <hfp:hasFacet name="minLength"/>
            <hfp:hasFacet name="maxLength"/>
            <hfp:hasFacet name="pattern"/>
            <hfp:hasFacet name="enumeration"/>
            <hfp:hasFacet name="whiteSpace"/>
            <hfp:hasProperty name="ordered" value="false"/>
            <hfp:hasProperty name="bounded" value="false"/>
            <hfp:hasProperty name="cardinality" value="countably infinite"/>
            <hfp:hasProperty name="numeric" value="false"/>
        </xs:appinfo>
        <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#QName"/>
    </xs:annotation>

    <xs:restriction base="xs:anySimpleType">
        <xs:whiteSpace value="collapse" fixed="true" id="QName.whiteSpace"/>
    </xs:restriction>
</xs:simpleType>

[Definition]
QName represents XML qualified names. The value space of QName is the set of tuples {namespace name, local part}, where namespace name is an anyURI and local part is an NCName. The lexical space of QName is the set of strings that match the QName production of [Namespaces in XML].

限定名称由命名空间名称和本地部分组成,命名空间名称是任意 URI,而本地部分则是由用户定义的名称(NCName,non-colonized Name)。

2.1.6.3、实体标记 - NOTATION 简单类型
<xs:simpleType name="NOTATION" id="NOTATION">
    <xs:annotation>
        <xs:appinfo>
            <hfp:hasFacet name="length"/>
            <hfp:hasFacet name="minLength"/>
            <hfp:hasFacet name="maxLength"/>
            <hfp:hasFacet name="pattern"/>
            <hfp:hasFacet name="enumeration"/>
            <hfp:hasFacet name="whiteSpace"/>
            <hfp:hasProperty name="ordered" value="false"/>
            <hfp:hasProperty name="bounded" value="false"/>
            <hfp:hasProperty name="cardinality" value="countably infinite"/>
            <hfp:hasProperty name="numeric" value="false"/>
        </xs:appinfo>
        <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#NOTATION"/>
    </xs:annotation>
    
    <xs:restriction base="xs:anySimpleType">
        <xs:whiteSpace value="collapse" fixed="true" id="NOTATION.whiteSpace"/>
    </xs:restriction>
</xs:simpleType>

[Definition : Notations identify by name the format of unparsed entities, the format of elements which bear a notation attribute, or the application to which a processing instruction is addressed.]

NOTATION 通过名称标识:

  1. 未解析实体的格式
  2. 能够帮助 XML 处理器处理实体的外部应用程序

Schema Component Constraint: enumeration facet value required for NOTATION
It is an error for NOTATION to be used directly in a schema. Only datatypes that are derived from NOTATION by specifying a value for enumeration can be used in a schema.

在 schema 中直接使用 NOTATION 类型是不合法的,只能使用通过 enumeration 限制派生后的类型。

例如:

<xs:notation name="gif" public="image/gif" system="view.exe"/>
<xs:notation name="jpeg" public="image/jpeg" system="view.exe"/>

<xs:element name="image">
    <xs:complexType>
        <xs:simpleContent>
            <xs:attribute name="type">
                <xs:simpleType>
                    <xs:restriction base="xs:NOTATION">
                        <xs:enumeration value="gif"/>
                        <xs:enumeration value="jpeg"/>
                    <xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

<image type="gif"></image>

2.2、派生数据类型 25 种

2.2.1、派生字符串类型 12 种
数据类型 派生类型 限制 描述
xs:normalizedString string 类型 whiteSpace="replace" 规范化字符串。XML 处理器会移除制表符、换行以及回车
xs:token normalizedString 类型 whiteSpace="collapse" 标记。XML 处理器会移除制表符、换行、回车以及开头和结尾的空格,多个连续空格的内部序列会被缩减为一个空格
xs:language token 类型 pattern="[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*" RFC3066 规定的合法的语言标识
xs:NMTOKEN token 类型 pattern="\c+",\c 表示NameChar 名称标记
xs:NMTOKENS NMTOKEN 集合 list itemType="xs:NMTOKEN"、minLength=1 名称标记集合
xs:Name token 类型 pattern="\i\c*",\i 表示 NameStartChar,\c 表示 NameChar 名称
xs:NCName Name 类型 pattern="[\i-[:]][\c-[:]]*",\i 表示 NameStartChar,\c 表示NameChar “non-colonized” Name,即用户定义名称
xs:ID NCName 类型 唯一标识
xs:IDREF NCName 类型 唯一标识引用
xs:IDREFS IDREF 集合 list itemType="xs:IDREF"、minLength=1 唯一标识引用集合
xs:ENTITIE NCName 类型 实体
xs:ENTITIES ENTITY 集合 list itemType="xs:ENTITY"、minLength=1 实体集合
2.2.1.1、名称标记 - NMTOKEN 简单类型
<xs:simpleType name="NMTOKEN" id="NMTOKEN">
    <xs:annotation>
        <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#NMTOKEN"/>
    </xs:annotation>
    
    <xs:restriction base="xs:token">
        <xs:pattern value="\c+" id="NMTOKEN.pattern">
            <xs:annotation>
                <xs:documentation source="http://www.w3.org/TR/REC-xml#NT-Nmtoken">
                    pattern matches production 7 from the XML spec
                </xs:documentation>
            </xs:annotation>
        </xs:pattern>
    </xs:restriction>
</xs:simpleType>

pattern:

[4]    NameStartChar  ::=  ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a]   NameChar  ::=  NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[5]    Name  ::=  NameStartChar (NameChar)*
[6]    Names  ::=  Name (#x20 Name)*
[7]    Nmtoken  ::=  (NameChar)+
[8]    Nmtokens  ::=  Nmtoken (#x20 Nmtoken)*
2.2.1.2、用户定义名称 - NCName 简单类型
<xs:simpleType name="NCName" id="NCName">
    <xs:annotation>
        <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#NCName"/>
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XSD专程XML,非常实用。class CSaxContentHandler : public ISAXContentHandler { public: CSaxContentHandler(); virtual ~CSaxContentHandler(); virtual long __stdcall QueryInterface(const struct _GUID &, void **); virtual unsigned long __stdcall AddRef(void); virtual unsigned long __stdcall Release(void); virtual HRESULT STDMETHODCALLTYPE putDocumentLocator( /* [in] */ ISAXLocator __RPC_FAR *pLocator); virtual HRESULT STDMETHODCALLTYPE startDocument(void); virtual HRESULT STDMETHODCALLTYPE endDocument(void); virtual HRESULT STDMETHODCALLTYPE startPrefixMapping( /* [in] */ wchar_t __RPC_FAR *pwchPrefix, /* [in] */ int cchPrefix, /* [in] */ wchar_t __RPC_FAR *pwchUri, /* [in] */ int cchUri); virtual HRESULT STDMETHODCALLTYPE endPrefixMapping( /* [in] */ wchar_t __RPC_FAR *pwchPrefix, /* [in] */ int cchPrefix); virtual HRESULT STDMETHODCALLTYPE startElement( /* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri, /* [in] */ int cchNamespaceUri, /* [in] */ wchar_t __RPC_FAR *pwchLocalName, /* [in] */ int cchLocalName, /* [in] */ wchar_t __RPC_FAR *pwchRawName, /* [in] */ int cchRawName, /* [in] */ ISAXAttributes __RPC_FAR *pAttributes); virtual HRESULT STDMETHODCALLTYPE endElement( /* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri, /* [in] */ int cchNamespaceUri, /* [in] */ wchar_t __RPC_FAR *pwchLocalName, /* [in] */ int cchLocalName, /* [in] */ wchar_t __RPC_FAR *pwchRawName, /* [in] */ int cchRawName); virtual HRESULT STDMETHODCALLTYPE characters( /* [in] */ wchar_t __RPC_FAR *pwchChars, /* [in] */ int cchChars); virtual HRESULT STDMETHODCALLTYPE ignorableWhitespace( /* [in] */ wchar_t __RPC_FAR *pwchChars, /* [in] */ int cchChars); virtual HRESU

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值