说到记录XML文件的结构......
我的一位同事在Word表格中做到了这一点。
另一个将元素粘贴到Word文档中,其中包含以下注释:
<learningobject id="{Learning Object Id (same value as the loid tag)}"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.aicpcu.org/schemas/cms_lo.xsd">
<objectRoot>
<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>
首选哪种方法?还有更好的方法吗?
是否有其他选项不需要第三方Schema Documenter工具进行更新?
答案 0 :(得分:37)
我编写了一个XML Schema(XSD)文件来定义XML文档的结构。可以包含xs:annotation
和xs:documentation
标记来描述元素。可以使用xs3p等XSLT样式表或XML Schema Documenter等工具将XSD文件转换为文档。
有关XML Schema的介绍,请参阅XML Schools tutorial。
以下是您的示例,表示为带有xs:annotation
标记的XML架构:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="objectroot">
<xs:complexType>
<xs:sequence>
<xs:element name="v" type="xs:string">
<xs:annotation>
<xs:documentation>Current version of the object from the repository.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="label" minOccurs="0" maxOccurs="unbounded" type="xs:string">
<xs:annotation>
<xs:documentation>Name of the object from the repository.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
答案 1 :(得分:5)
尝试使用各种XML模式语言,我发现RELAX NG最适合大多数情况(最后的推理)。
我添加了一个属性,以便在文档中说明这种类型的结构。
<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允许以下列方式描述示例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注释,而不是文档元素。多个连续注释(如示例中所示)将变为单个元素中的单个多行文档字符串。
显而易见的事实:doc.xml
中的内联XML注释无关紧要,只有schema.rnc
计数中的内容。
假设您有一个名为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文档规范。
有jing
和rnv
等开源工具支持RELAX NG Compact语法,可在Linux和MS Windows上使用。
注意:这些工具相当陈旧,但非常稳定。把它看作稳定的标志,而不是过时的标志。
使用jing:
$ jing -c schema.rnc doc.xml
-c
很重要,jing
默认采用XML形式的RELAX NG。
使用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,您可以获得两者 - 人类可读的模式,甚至可用于自动验证。
现有限制不会经常生效,并且在许多情况下可以通过评论或其他方式解决。
答案 2 :(得分:4)
您可以尝试通过创建XSD架构来记录它,该架构可以提供更正式的XML规范。许多工具将以样本XML为起点为您生成XSD。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="objectroot">
<xs:complexType>
<xs:sequence>
<xs:element name="v" minOccurs="1" type="xs:string"/> <!-- current version -->
<xs:element name="label" type="xs:string"/> <!-- object name -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
答案 3 :(得分:2)
就个人而言,我更希望在XML中看到它(第二种方式)。
将元素放在表格中并不能清楚地告诉您哪些元素是哪些元素的父元素等等。将它放在XML中更加清晰,我可以看到发生了什么。
答案 4 :(得分:2)
在表格中显示它有其限制,例如mulit级别的嵌套子级,但对于一个简单的XML结构,我认为这很好。对于任何具有多个嵌套级别的东西,我更喜欢XML方式。
更好的方法是创建XML Schema(XSD)文件。这样,您就可以在XML中看到它,并且可以在使用某些软件对模式文件输入数据后检查文件。
有关XSD的一系列精彩教程,请查看w3schools - XML Schema Tutorial
答案 5 :(得分:0)
我只想添加一件事,以防有人发现它有用。我有时用 HTML 编程,有时用 android 编程。当我做HTML时,我按照与W3Schools格式相同的格式记录我的自定义XML,如http://www.w3schools.com/tags/att_a_href.asp中那样,如果它是我正在处理的Android项目,那么我遵循http://developer.android.com/guide/topics/manifest/activity-element.html#screen中的Google标准。 这样,我合作的程序员不需要做任何额外的工作来理解我的文档。