【发布时间】:2012-08-02 21:39:29
【问题描述】:
我正在努力自动化测试一个接受和返回 XML 的 API,所以我想尽可能地将 API 的记录返回数据转换为模式。基于易用性和学习性,我选择了 RelaxNG 来完成这项任务。
在我输入所有信息之前,这是一个问题:
是否可以描述“无序的元素集,同名但属性不同”?
这是一个我无法描述的示例对象:
<item>
<id>d395136e-d060-4a6e-887c-c0337dd7ad09</id>
<name>The item has a name</name>
<link rel="self" type="type1" href="url" />
<link rel="download" type="type2" href="url" />
<link rel="relatedData" type="type3" href="url" />
</item>
链接对象是我要挂断的部分。问题来了:
- item 中元素的顺序无法保证,所以我尝试将所有元素放入
<interleave>结构中。 -
<item>内将有多个<link>元素,具有不同的属性集(即<item>必须有一个“self”链接、一个“下载”链接和一个“relatedData”链接才有效)。 - 每种链接类型都需要一种,但不能保证同样的顺序。
我试图这样描述架构:
<element name="item">
<interleave>
<element name="id"><text/></element>
<element name="name"><text/></element>
<ref name="selfLink"/>
<ref name="launchLink"/>
<ref name="thumbnailLink"/>
</interleave>
</element>
“链接”引用在其他地方定义如下:
<define name="selfLink">
<element name="link">
<attribute name="href"><text/></attribute>
<attribute name="rel"><value>self</value></attribute>
<attribute name="type"><value>type1</value></attribute>
</element>
</define>
解析器对此并不满意 - 从 jing 我得到error: the element "link" can occur in more than one operand of "interleave"。我可以看到它的含义,但我希望它可以将“具有相同名称但属性不同的元素”的想法作为独特的项目来处理。
将链接 refs 移出 interleave 可以对其进行解析,但只要返回数据中的顺序发生变化,我就会等待验证器崩溃。
有什么想法,或者这不可能吗? 我正在处理的 XML 是否存在固有问题,需要我在测试应用程序中将其中的一些提升到更高的处理逻辑(在运行更通用的 XML 验证后手动检查每种链接类型?)
【问题讨论】:
-
当你说“不同的属性”时,你真的是指“不同的属性值”吗?
-
其实,是的,谢谢你的澄清。具有不同价值要求的同一组属性。