享受 RELAX NG 紧凑的语法
通过对各种 XML 模式语言的试验,我发现 RELAX NG 最适合大多数情况(最后推理)。
要求
- 允许记录 XML 文档结构
- 以可读的形式进行
- 为作者保持简单
修改后的示例 XML (doc.xml)
我添加了一个属性,以在文档中说明这种类型的结构。
<objectRoot created="2015-05-06T20:46:56+02:00">
<v>
<!-- Current version of the object from the repository. !-->
<!-- (Occurance: 1) -->
</v>
<label>
<!-- Name of the object from the repository. !-->
<!-- (Occurance: 0 or 1 or Many) -->
</label>
</objectRoot>
使用带有注释的 RELAX NG Compact 语法 (schema.rnc)
RELAX NG 允许以下列方式描述示例 XML 结构:
start =
## Container for one object
element objectRoot {
## datetime of object creation
attribute created { xsd:dateTime },
## Current version of the object from the repository
## Occurrence 1 is assumed by default
element v {
text
},
## Name of the object from the repository
## Note: the occurrence is denoted by the "*" and means 0 or more
element label {
text
}*
}
我认为,很难超越简单性,保持一定的表现力水平。
如何评论结构
如果需要 XML Schema 1.0,请生成它 (schema.xsd)
假设您有一个名为 available 的(开源)工具trang
,您可以创建一个 XML Schema 文件,如下所示:
$ trang schema.rnc schema.xsd
生成的架构如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="objectRoot">
<xs:annotation>
<xs:documentation>Container for one object</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="v"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="label"/>
</xs:sequence>
<xs:attribute name="created" use="required" type="xs:dateTime">
<xs:annotation>
<xs:documentation>datetime of object creation</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="v" type="xs:string">
<xs:annotation>
<xs:documentation>Current version of the object from the repository
Occurance 1 is assumed by default</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="label" type="xs:string">
<xs:annotation>
<xs:documentation>Name of the object from the repository
Note: the occurance is denoted by the "*" and means 0 or more</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
现在,坚持只使用 XML Schema 1.0 的客户可以使用您的 XML 文档规范。
根据 schema.rnc 验证 doc.xml
有一些开源工具,例如jing
并rnv
支持 RELAX NG Compact 语法,并且可以在 Linux 和 MS Windows 上运行。
注意:这些工具相当陈旧,但非常稳定。将其视为稳定的标志,而不是过时的标志。
使用精:
$ jing -c schema.rnc doc.xml
-c
重要的是,jing
默认情况下假定 RELAX NG 采用 XML 格式。
使用rnv
检查,schema.rnc
本身是有效的:
$ rnv -c schema.rnc
并验证doc.xml
:
$ rnv schema.rnc doc.xml
rnv
允许一次验证多个文档:
$ rnv schema.rnc doc.xml otherdoc.xml anotherone.xml
RELAX NG Compact 语法 - 专业人士
- 非常易读,即使是新手也应该理解文本
- 简单易学(RELAX NG 自带教程,一天就能学会大部分内容)
- 非常灵活(尽管它看起来很简单,但它涵盖了很多情况,其中一些甚至无法通过 XML Schema 1.0 解决)。
- 存在一些用于转换成其他格式的工具(RELAX NG XML 表单、XML Schema 1.0、DTD,甚至生成示例 XML 文档)。
RELAX NG 限制
- 多重性只能是“零或一”、“仅一”、“零或更多”或“一或多个”。(少量元素的多重性可以用“零或一”定义的“愚蠢重复”来描述)
- 存在 XML Schema 1.0 构造,RELAX NG 无法描述这些构造。
结论
对于上面定义的要求,RELAX NG Compact 语法看起来是最合适的。使用 RELAX NG,您可以同时获得 - 人类可读的模式,甚至可用于自动验证。
现有限制不会经常生效,在许多情况下可以通过评论或其他方式解决。