加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML——XML Schema

发布时间:2020-12-16 05:57:23 所属栏目:百科 来源:网络整理
导读:【0】README 0.0) 本文文字描述转自 core java volume 2 , 旨在理解 XML——XML Schema 的基础知识 ;(本文不涉及源代码, 很遗憾,以后会补充) 【1】XML Schema 相关 1.0)为什么引入XML Schema? 如果要指定文档结构,可以提供一个文档类型定义(DTD)

【0】README

0.0)本文文字描述转自 core java volume 2 , 旨在理解 XML——XML Schema 的基础知识 ;(本文不涉及源代码, 很遗憾,以后会补充)


【1】XML Schema 相关

1.0)为什么引入XML Schema? 如果要指定文档结构,可以提供一个文档类型定义(DTD)或一个 XML Schema定义;DTD 或 schema 包含了用于解释文档应该如何构成的规则, 这些规则指定了每个元素的合法子元素和和属性; (干货——为什么引入XML Schema)

1.1)如果要在文档中引用 Schema 文件, 需要在 根元素中添加属性, 例如:

<?xml version="1.0"?>
<configuration xmlns:xsi="http://www.w2.org/2001.XMLSchema-instance" xsi:noNamespaceSchemaLocation="config.xsd">
</configuration>
  • 这个声明是在说: Schema文件 config.xsd 会被用来验证文档;(而 前缀xsi 是一个命名空间别名——namespace alias); (干货——前缀xsi 是一个命名空间别名)

1.2)Schema使用命名空间定义了每个元素的类型。类型可以是简单类型,即有格式限制的字符串或复杂类型。 (干货——Schema使用命名空间定义了每个元素的类型。)

  • 1.2.1)一些简单类型已经被内建到了 XML Schema 内,包括:
xsd : string
xsd : int
xsd : boolean

Attention)

  • A1)我们用前置 xsd: 来表示XSL Schema定义的命名空间, 一些作者用 xs: 代替;
  • A2)可以自定义自己的简单类型:
<xsd: simpleType name="StyleType">
    <xsd: restriction base="xsd:string">
        <xsd: enumeration value="PLAIN">
        <xsd: enumeration value="BOLD">
        <xsd: enumeration value="ITALIC">
        <xsd: enumeration value="BOLD_ITALIC">
    </xsd: restriction>
</xsd: simpleType>
  • A2.1)当定义元素时,要指定它的类型:
<xsd: element name="name" type="xsd:string" />
<xsd: element name="size" type="xsd:int" />
<xsd: element name="style" type="StyleType" />
  • A2.2)类型约束了元素的内容, 下面 的元素个数被验证为正确格式:
<size>10</size>
<style>PLAIN</style>
  • A2.3)但是下面的元素会被解析器拒绝:
<size>default</size>
<style>SLANTED</style>
  • A2.4)你可以把类型组合成复杂类型, 如:
<xsd:complexType name="FontType">
    <xsd:sequence>
        <xsd:element ref="name"/>
        <xsd:element ref="size"/>
        <xsd:element ref="style"/>
    </xsd:sequence>
</xsd:complexType>
  • A2.5)嵌套定义:在上面的类型定义中, 我们用ref 属性来引用在 Schema 中位于别处的定义。也可以嵌套定义, 如这样:
<xsd:complexType name="FontType">
    <xsd:sequence>       
        <xsd: element name="name" type="xsd:string" />
        <xsd: element name="size" type="xsd:int" />
        <xsd: element name="style" type="StyleType" />
            <xsd: simpleType> // 而不是<xsd: simpleType name="StyleType">, 请注意这叫匿名定义;
                <xsd: restriction base="xsd:string">
                    <xsd: enumeration value="PLAIN">
                    <xsd: enumeration value="BOLD">
                    <xsd: enumeration value="ITALIC">
                    <xsd: enumeration value="BOLD_ITALIC">
                </xsd: restriction>
        </xsd: simpleType>
    </xsd:sequence>
</xsd:complexType>
  • A2.6)xsd: choice 和 | 操作符等价, 如: (干货——xsd:choice 和 | 操作符等价)
<xsd:complexType name="contactinfo">
    <xsd:choice>
        <xsd:element ref="email">
        <xsd:element ref="phone">
    </xsd:choice>
</xsd:complexType>
同:
<xsd:complexType name="contactinfo">
         <xsd:element ref="email | phone">
</xsd:complexType>
  • A2.7)如果允许使用重复元素,使用 minoccurs 和 maxoccurs 属性:

  • A2.7.1)看个荔枝:与 DTD类型 item* 的等价形式如下:
    <xsd:element name="item" type="..." minoccurs="0" maxoccurs="unbounded">

  • A2.7.2)如果要指定属性, 可以吧 xsd:attribute 元素添加到 complexType定义中去:

<xsd:element name=szie>
    <xsd:complexType>
        ...
        <xsd:attribute name="unit" type="xsd:string" use = "optional" default="cm"/>
    </xsd:complexType>
</xsd:element>
  • A2.8)这是DTD 声明等价 的形式:
    <!ATTLIST size unit CDATA #IMPLIED "cm">

  • A2.9) 可以把 Schema 的元素和类型定义封装在 xsd:schema 元素中:

<xsd: schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
</xsd: schema>
  • A2.10)解析带有 Schema 的XML 文件和解析带有 DTD 的文件相似, 但有3点差别(Difference): (干货—— Schema 的XML 文件和带有 DTD 的XML文件的差别有3)

    • D1)必须打开对命名空间的支持,即使在 XML 文件里你不使用它;
      factory.setNamespaceAware(true);
    • D2)必须通过如下 “魔咒”来准备好处理 Schema 的工厂:
      final String JAXP_SCHEMA_LANGUAGE="http://java.sun.com/xml/jaxp/properties/schemaLanguage";
      final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
      factory.setAttribute(JAXP_SCHEMA_LANGUAGE,W3C_XML_SCHEMA );
    • D3) 解析器不会丢弃元素中的空白字符, 这是个很老火的问题;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读