XML 文档的验证 DTD XSD

XML验证

有正确的XML被称为"形式良好"的XML

DTD约束

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD可声明在XML文档中, 也可通过外部引入

内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE root-element [element-declarations]>

带有 DTD 的 XML 文档实例(请在 IE5 以及更高的版本打开,并选择查看源代码):

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
	<to>Tove</to>
	<from>Jani</from>
	<heading>Reminder</heading>
	<body>"Don't forget me this weekend"</body>
</note>

解释如下

  1. !DOCTYPE note (第二行): 定义此文档是note类型的文档
  2. !ELEMENT note: 定义note元素有四个元素: "to, from, heading, body”
  3. !ELEMENT to: 定义to元素为"#PCDATA"类型
  4. !ELEMENT from: 定义from 元素为"#PCDATA"类型
  5. !ELEMENT heading素为"#PCDATA"类型
  6. !ELEMENT body: 定义from 元素为"#PCDATA"类型
外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE root-element SYSTEM "filename">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
	<to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Dot't forget me this weekend!</body>
</note>

这是包含DTD的note.dtd文件

<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
PCDATA数据格式

PCDATA 的意思是被解析的字符数据( parsed character data).

可把字符数据想象为XML元素的开始标签与结束标签之间的文本 PCDATA 是会被解析器解析的文本, 这些文本将被解析器检查实体以及标记. 文本中的标签会被当做标记来处理, 而实体会被展开. 不过, 被解析的字符数据不应该包含任何&, < 或 >等字符. 需要用实体来表示.

CDATA数据格式

CDATA 的意思是字符数据(character data)。

**CDATA 是不会被解析器解析的文本。**在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

元素格式
  1. 空元素 <!ELEMENT element-name EMPTY>
  2. 可以为任何内容 <!ELEMENT element-name ANY>
  3. 最少出现一次的元素 <!ELEMENT element-name (child-name+)>
  4. 出现零次或多次的元素 <!ELEMENT element-name (child-name*)>
  5. 出现零次或一次的元素<!ELEMENT element-name (child-name?)>
  6. 声明"非…/即…"类型的内容<!ELEMENT element-name (child-name1 | child-name2 | …)>
  7. 声明混合型的内容<!ELEMENT element-name (#PCDATA | to | from | heading)*>
属性约束格式

属性通过ATTLIST 声明来进行声明

DTD属性声明用如下格式

<!ATTLIST element-name attribute-name attribute-type attribute-value>
<!ATTLIST payment type CDATA "check">
<!--实例如下-->
<payment type="check"/>

属性类型:

类型描述
CDATA值为字符数据 (character data)
(en1|en2|…)此值是枚举列表中的一个值
ID值为唯一的 id
IDREF值为另外一个元素的 id
IDREFS值为其他 id 的列表
NMTOKEN值为合法的 XML 名称
NMTOKENS值为合法的 XML 名称的列表
ENTITY值是一个实体
ENTITIES值是一个实体列表
NOTATION此值是符号的名称
xml:值是一个预定义的 XML 值

默认属性值可以使用下列值

解释
属性的默认值
#REQUIRED属性值是必需的
#IMPLIED属性不是必需的
#FIXED value属性值是固定的

列举属性值

<!ATTLIST element-name attribute-name (en1|en2|..) default-value>

XML Schema约束

简介
  • XML Schema是基于XML的DTD代替者
  • XML Schema是可描述XML文档的结构
  • XML Schem语言也可作为XSD(XML Schema Definition) 来引用
什么是XML Schema

XML Schema 的作用是定义XML文档的合法构建模块, 类似DTD

XML Schema:

  • 定义可出现在文档中的元素
  • 定义可出现在文档中的属性
  • 定义哪个元素是子元素
  • 定义子元素的顺序
  • 定义子元素的数目
  • 定义元素是否为空, 或者是否可包含文本
  • 定义元素和属性的数据类型
  • 定义元素和属性的默认值以及固定值
XML Schema 是 DTD的继任者
  • XML Schema可针对未来的需求进行扩展
  • XML Schema 更完善, 功能更强大
  • XML Schema 基于XML编写
  • XML Schema支持数据类型
  • XML Schema支持命名空间
XML Schema使用XML语法编写, 本身就是XML
  • 不必学习新的语言
  • 可使用XML编辑器来编写Schema文件
  • 可使用XML解析器来解析Schema文件
  • 可使用XML DOM来处理Schema文件
  • 可通过XSLT来转换Schema文件
如何使用

一个简单的XML文档

<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

下面这个例子是一个名为"note.xsd”的XML Schema文件, 它定义了上面哪个note.xml文档的元素

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">

<xs:element name="note">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="to" type="xs:string"/>
            <xs:element name="from" type="xs:string"/>
            <xs:element name="heading" type="xs:string"/>
            <xs:element name="body" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

将此note.xml文档包含xml Schema的约束, 使用如下

<?xml version="1.0" encoding="utf-8"?>
<note xmlns="http://www.w3schools.com"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3schools.com note.xsd">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>
XSD-元素

schema元素是每一个xml Schema的根元素

<?xml version="1.0" encoding="utf-8"?>
<xs:schema>
...
...
</xs:schema>

元素一般都包含属性. 一个schema声明往往是这样的

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	targetNamespace="http://www.runoob.com"
	xmlns="http://www.runoob.com"
	elementFormDefault="qualified">
>
...
...
</xs:schema>

解释如下:

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

    此片段显示schema中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchema”中. 同时它还规定了来自命名空间"http://……." 的元素和数据类型应该使用前缀xs:, 相当于命名空间的别名

  2. targetNamespace="http://www.runoob.com

    此片段显示被此schema定义的元素(note to from heading body) 来自命名空间:"http:www.runoob.com”.

  3. elementFormDefault=“qualified”

    指出任何xml实例所使用的且在此schema中声明过的元素必须被命名空间限定

在XML文档中引用Schema文档是这样的

<?xml version="1.0" encoding="utf-8"?>
<note xmlns="http://www.runoob.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.runoob.com note.xsd">

<to>Tove</to>
<form>Jani</form>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

解释如下:

  1. xmlns=“http://www.runoob.com

    规定了默认命名空间的声明, 此声明会告知schema验证器, 在此XML文档中使用的所有元素都被声明于"http://www.runoob.com”这个命名空间

  2. xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

    一旦声明了此命名空间, 就可以使用schemaLocation属性了, 此属性有两个值, 第一个值是需要的命名空间, 第二个值是供命名空间使用的xml schema的位置

XSD-简易属性

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

定义简易元素:

<xs:element name=“xxx” type=“yyy” />

xxx: 指元素的名称, yyy指元素的数据类型, XML Schema拥有很多内建的数据类型

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

例如:

<lastname>Refsnes</lastname>
<age>36</age>
<databorn>1970-03-27</databorn>

xsd定义如下

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

简易元素的默认值和固定值

缺省值定义

<xs:element name="color" type="xs:string" default="red"/>

固定值是不能被更改的

<xs:element name="color" type="xs:string" fixed="red"/>
xsd-对值的限定

限定(restriction) 用于为xml元素或者属性定义可接受的值, 对xml元素的限定被称为 facet

限定age元素, 0<age<120

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

对一组值的限定

如果把XML元素的内容限制为一组可接受的值, 我们使用枚举约束.

下面例子定义了一个带有限定的名为"Car”的元素, 可接受的值只有"Audi Golf BWM”

<xs:element name="car">
	<xs:simplyType>
    	<xs:restriction base="xs:string">
        	<xs:enumeration value="Audi"/>
            <xs:enumeration value="Golf"/>
            <xs:enumeration value="BWM"/>
        </xs:restriction>
    </xs:simplyType>
</xs:element>

也可以写成这样

<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
	<xs:restriction base="xs:string">
    	<xs:enumeration value="Audi"/>
        <xs:enumeration value="Gold"/>
        <xs:enumeration value="BWM" />
    </xs:restriction>
</xs:simpleType>

这种写法中, 类型"carType"也可以被其他元素使用, 因为它不是car元素的组成部分

对一系列值得限定

我们可以使用模式约束对xml元素得内容进行一系列得限定

限定"letter"元素, 可接受得值只有小写字母a-z其中得一个

<xs:element name="letter">
	<xs:simpleType>
    	<xs:restriction base="xs:string">
        	<xs:pattern value="[a-z]"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

pattern中可填放正则表达式

对空白字符得限定

下面例子, 定义了一个带有限定得名为"address”得元素. 这个whiteSpace 限定设置为"preserve", 这意味着XML处理器不会移除任何一个空白字符

<xs:element name="address">
	<xs:simpyType>
    	<xs:restriction base="xs:string">
        	<xs:whiteSpace value="preserve"/>
        </xs:restriction>
    </xs:simpyType>
</xs:element>

限定"address"元素移除所有空格:

<xs:element name="address">
	<xs:simpleType>
    	<xs:restriction  base="xs:string">
        	<xs:whiteSpace value="replace"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

限定元素"address"将所有得空格只保留一个空格, 类似HTML

<xs:element name="address">
	<xs:simpleType>
    	<xs:restriction base="xs:string">
        	<xs:whiteSpace value="cellaase"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

对长度得限定:

使用length, maxLength, minLength来限定一个元素中值得长度

限定名为"password"得元素, 长度必须精确到8位

<xs:element name="password">
	<xs:simpeType>
    	<xs:restriction base="xs:string">
        	<xs:length value="8"/>
        </xs:restriction>
    </xs:simpeType>
</xs:element>
数据类型得限定表格
限定描述
enumeration定义可接受值的一个列表
fractionDigits定义所允许的最大的小数位数。必须大于等于0。
length定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive定义数值的上限。所允许的值必须小于此值。
maxInclusive定义数值的上限。所允许的值必须小于或等于此值。
maxLength定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive定义数值的下限。所允许的值必需大于此值。
minInclusive定义数值的下限。所允许的值必需大于或等于此值。
minLength定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern定义可接受的字符的精确序列。
totalDigits定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace定义空白字符(换行、回车、空格以及制表符)的处理方式。
复合元素

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

四种类型得复合元素

  • 空元素
  • 包含其他元素得元素
  • 仅包含文本得元素
  • 包含元素和文本得元素

如何定义复合元素

<employee>
	<firstname>John</firstname>
    <lastname>Smith</lastname>
</employee>

现在我们用xsd来定义此元素

sequence 意味着此元素必须包含指定得顺序

<xs:element name="employee">
	<xs:complexTyep>
    	<xs:sequence>
        	<xs:element name="firstname" type="xs:string"/>
            <xs:element name="lastname" type="xs:string" />
        </xs:sequence>
    </xs:complexTyep>
</xs:element>

以上也可以这样写

<xs:element name="employee" type="personinfo"/>

<xs:complexType name="personinfo">
	<xs:sequence>
    	<xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
</xs:complexType>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[实验目的] 1、安装并学习如何使用XMLSPY集成开发环境完成XML相关的开发工作。 2、熟悉和掌握XML规范的基本内容,包括XML声明、注释、处理指令、元素、属性、CDATA段、预定义实体、命名空间的使用,以及如何进行XML文档良构和有效性验证;能够灵活地使用XML层次数据来表示各种信息。 3、掌握如何在DTD文档声明元素及其内容模型、属性,以及实体的声明和使用;使用内部/外部DTD规则,对XML数据文档有效性进行约束。 [实验内容和步骤] 1、安装XMLSPY集成开发环境,新建XMLDTD文档,在各种不同的编辑视图尝试采用不同的方式完成XML文档的编辑和查看;并使用XMLSPY提供的便利,建立XMLDTD两者之间的关联,进行XML文档的良构以及有效性验证。 2、附件提供了一个名为SpyBase的Excel文件,其包含Alias、Mission和Spy三张数据表,请分别完成下列任务: ①.使用一个XML文档(SpyBase1.xml)来描述其包含的所有信息,基本保持原有数据的形式(不要将三个表的数据进行嵌套)。请使用XML文档的Grid视图完成该文档的编写(需使用Grid视图提供的表操作工具条),并验证文档的良构性。结果示例如下图所示(该图仅供参考,要求对aID、mID、spyID必须使用XML属性,其他字段使用XML元素): ②.使用一个XML文档(SpyBase2.xml)来描述其包含的所有信息,要求通过XML元素的正确嵌套消除数据之间的参照关系产生的冗余。请使用XML文档的Text或者Grid视图完成该文档的编写,并验证文档的良构性。 3、为第二步得到的SpyBase1.xml、SpyBase2.xml分别编写相应的外部DTD文档,建立模式与数据之间的关联,并进行文档有效性验证。在编写的DTD文档,要求在DTD文档使用参数实体来替换所有的#PCDATA和CDATA。 [实验思考] 在本实验发现,一个XML文档可以通过平面的形式、或者层次的形式来表示多个关系数据库的二维表,那么哪种方式更合适,为什么? [提交时间及内容] 最后提交时间 2013年?月?日 提交内容 提交SpyBase1.xml、SpyBase2.xml。 提交SpyBase1.dtd、SpyBase2.dtd
在 C++ 使用 XSD 文件检测 XML 需要用到第三方库,比如 Xerces-C++。下面是使用 Xerces-C++ 库检测 XML 的步骤: 1. 安装 Xerces-C++ 库并包含其头文件。 2. 创建 XSD 文件,定义 XML 文档的结构和约束。 3. 创建 XML 文档并加载到内存。 4. 创建 Xerces-C++ 的 DOM 解析器,并设置解析器的验证属性。 5. 创建 Xerces-C++ 的 DOM 文档对象,并将 XML 文档加载到该对象。 6. 创建 Xerces-C++ 的 DOM 文档类型对象,并将 XSD 文件加载到该对象。 7. 使用解析器解析 XML 文档,并将 XSD 文件作为第二个参数传递给解析器的 parse 方法。 8. 如果 XML 文档符合 XSD 文件定义的约束,则它是有效的 XML 文档。如果不符合,则会出现错误或警告。 以下是使用 Xerces-C++ 库检测 XML 的示例代码: ``` #include <xercesc/dom/DOM.hpp> #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/util/XMLUni.hpp> #include <xercesc/framework/LocalFileInputSource.hpp> #include <iostream> using namespace xercesc; using namespace std; int main(int argc, char* argv[]) { try { XMLPlatformUtils::Initialize(); // 加载 XML 文档 XercesDOMParser parser; parser.parse("example.xml"); // 创建 DOM 文档对象 DOMDocument* doc = parser.getDocument(); // 创建 DOM 文档类型对象 DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("Core")); DOMDocumentType* type = impl->createDocumentType( XMLString::transcode("example"), XMLString::transcode("example.dtd"), XMLString::transcode("example.sys") ); // 创建解析器并设置验证属性 parser.setDoValidation(true); parser.setDoSchema(true); parser.setValidationSchemaFullChecking(true); // 解析 XML 文档并检测约束 parser.parse("example.xml"); if(parser.getErrorCount() == 0) { cout << "XML is valid." << endl; } else { cout << "XML is not valid." << endl; } XMLPlatformUtils::Terminate(); } catch(const XMLException& e) { cerr << "Error: " << XMLString::transcode(e.getMessage()) << endl; return 1; } return 0; } ``` 在此示例,example.xml 是要验证XML 文档的名称,example.dtdXSD 文件的名称。如果 XML 文档符合 XSD 文件定义的约束,则输出 "XML is valid.",否则输出 "XML is not valid."。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值