做 schema 验证 xml 实例题时,是不是常常卡在哪一步?拿到题目不知道先干啥,写了 schema 文件又不知道咋验证,最后对着报错信息一脸懵。小编之前练题时,光弄明白 “怎么让 xml 关联 schema” 就花了一节课,更别说找验证失败的原因了。今天就把完整步骤拆解开,结合例题实战,再提醒几个易错点,新手跟着走,很快就能掌握方法,一起往下看吧!
一、先理清:验证 xml 实例题,总共分几步?
可能有人会问,步骤很复杂吗?其实不复杂,总共就 4 步,记牢了就不会乱。
- 第一步:读懂题目要求,知道 xml 里该有啥元素、属性,规则是啥。
- 第二步:写 schema 文件,把这些规则翻译成 schema 能认的代码。
- 第三步:让 xml 文件关联上 schema,告诉 xml 该用哪个规则表。
- 第四步:用验证工具检查,看 xml 是不是符合 schema 的要求。
小编觉得,最容易出问题的是第三步,很多新手写完两个文件,忘了关联,结果验证时总提示 “找不到 schema”,白忙活半天。
二、例题实战:按步骤做一道题,看完就明白
就拿 “学生信息” 的例子来说,一步步教大家怎么做。
题目:
有如下 xml 实例,要求用 schema 验证它是否符合规则:
xml
<student>
<id>2023001id>
<name>赵六name>
<gender>男gender>
student>
规则:根元素是 student,包含 id(整数)、name(字符串)、gender(只能是 “男” 或 “女”)三个子元素,顺序不能乱。
步骤 1:分析题目,列规则清单
先把规则一条条写下来,免得漏了:
- 根元素:student
- 子元素:id(整数)、name(字符串)、gender(枚举 “男”“女”)
- 子元素顺序:id→name→gender
这一步就像做菜前先把食材列出来,心里有数了才不会做错。
步骤 2:写 schema 文件(保存为 student.xsd)
根据清单写代码,重点是定义元素类型和顺序:
xml
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="student">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:integer"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="男"/>
<xs:enumeration value="女"/>
xs:restriction>
xs:simpleType>
xs:element>
xs:sequence>
xs:complexType>
xs:element>
xs:schema>
这里 gender 用xs:enumeration
限制只能选 “男” 或 “女”,就像给它画了个圈,不能出圈。
步骤 3:让 xml 关联 schema(修改 xml 文件)
在 xml 的根元素里加一行代码,告诉它用哪个 schema 验证:
xml
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="student.xsd">
<id>2023001id>
<name>赵六name>
<gender>男gender>
student>
xsi:noNamespaceSchemaLocation
后面跟的是 schema 文件的路径,要是两个文件存在同一个文件夹里,直接写文件名就行。
步骤 4:用工具验证,查看结果
推荐用 W3C 的在线验证工具(搜 “XML Schema Validator” 就能找到),把 xml 内容复制进去,点验证按钮。
- 要是显示 “Valid”,说明通过了;
- 要是显示错误,会告诉你哪一行有问题,比如 gender 写成 “男性”,就会提示 “不允许的值”。
小编第一次验证时,因为把 schema 文件名写错了,工具提示 “找不到文件”,后来改对文件名就好了,所以路径和文件名一定要仔细核对。
三、不同验证结果的处理方法,表格对比更清楚
验证时可能遇到两种情况,处理方式不一样:
验证结果 | 可能原因 | 解决办法 |
---|---|---|
验证通过 | xml 符合 schema 的所有规则 | 可以继续用这个 xml,或者尝试修改一点内容再验证,加深理解 |
验证失败 | 1. xml 里的元素名写错了(比如把 “name” 写成 “neme”) 2. 顺序不对(比如 gender 写在 id 前面) 3. 数据类型错了(比如 id 写成字符串 “2023001a”) |
1. 对照 schema 检查拼写 2. 调整子元素顺序 3. 修改数据类型,符合 schema 的限制 |
比如有次小编把 gender 写成 “男生”,验证失败提示 “值不在枚举列表中”,改回 “男” 就通过了,错误提示其实很直白,看懂了就好改。
四、易错点提醒:这些地方最容易出错,新手要注意
- 关联 schema 时漏写
xmlns:xsi
:这行是声明命名空间,没有它,xsi:noNamespaceSchemaLocation
就会报错,一定得加上。 - schema 文件里的元素名和 xml 不一致:比如 schema 里是 “student”,xml 里写成 “students”,多了个 s 就会验证失败,这种细节得盯着看。
- 用了错误的验证工具:有些工具只验证 xml 格式对不对,不验证 schema 规则,得用专门支持 schema 验证的工具,比如前面说的 W3C 在线工具。
小编之前图省事,用记事本写 xml,结果因为少了个闭合标签,验证时一堆错误,后来换成带语法高亮的编辑器(比如 Notepad++),一眼就能看出哪错了,新手也可以试试。
五、再练一道带属性的题,巩固步骤
题目:验证如下 xml,规则是 book 元素有 isbn 属性(字符串,格式是 “数字 – 数字 – 数字”),包含 title(字符串)子元素。
xml
<book isbn="978-7-123">
<title>Schema入门title>
book>
大家可以按前面的步骤试试,先写 schema,再关联 xml,最后验证。提示一下,isbn 的格式可以用xs:pattern value="\d+-\d+-\d+"
来限制哦。
小编觉得,练个两三道题,步骤就记牢了。关键是别怕出错,验证失败了就对着错误提示找原因,比死记硬背管用多了。
其实 schema 验证 xml 就像老师批作业,schema 是标准答案,xml 是学生作业,验证步骤就是对照答案批改的过程。只要按步骤来,再注意那些易错点,很快就能上手。希望这些能帮到新手们,下次做题就不会慌啦!