享受RELAX NG紧凑语法
尝试使用各种XML模式语言后,我发现RELAX NG适用于大多数情况(原因在结尾处进行推理)。
要求
- 允许记录XML文档结构
- 以易读形式记录
- 对作者来说保持简单
修改的XML示例(doc.xml)
我添加了一个属性,以示出文档中也可以存在此类结构。
<objectRoot created="2015-05-06T20:46:56+02:00">
<v>
<!
<!
</v>
<label>
<!
<!
</label>
</objectRoot>
使用带有注释的RELAX NG紧凑语法(schema.rnc)
RELAX NG可以通过以下方式描述示例XML结构:
start =
element objectRoot {
attribute created { xsd:dateTime },
element v {
text
},
element label {
text
}*
}
我认为,在保持一定表达能力的前提下,保持简单性非常困难。
如何注释结构:
- 始终将注释放在相关元素之前,而不是之后。
- 为了可读性,在注释块之前使用一个空行。
- 使用“##”前缀,它会自动转换为其他模式格式中的文档元素。单个井号“#”转换为XML注释而不是文档元素。
- 多个连续的注释(如示例中)将转换为单个多行文档字符串,位于单个元素中。
- 明显的事实:在“doc.xml”中的内联XML注释是无关紧要的,只有“schema.rnc”中的内容才重要。
如果需要XML Schema 1.0,请生成它(schema.xsd)
假设您有一个名为“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:
$ 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简洁语法 - 优点
- 易读,即使新手也应该理解文本
- 易学 (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简洁语法似乎是最合适的选择。使用RELAX NG可以得到既适用于自动验证又易于阅读的模式。
现有的限制并不经常出现,并且在许多情况下可以通过注释或其他方式解决。