我正在努力自动化测试获取和返回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>
链接对象是我要挂断的位。这是问题所在:
<interleave>
结构中。<link>
内会有多个<item>
元素,具有不同的属性集(即<item>
必须有'自我'链接,'下载'链接和'' 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>
'link'引用在其他地方定义如下:
<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验证后手动检查每个链接类型?)
答案 0 :(得分:3)
看起来你在RELAX NG中偶然发现restriction on interleave。我会尝试在Schematron中完成此操作,或者可能是RELAX NG和Schematron的组合。
以下代码段使用supported by Jing版本的Schematron检查您的<link>
元素:
<schema xmlns="http://www.ascc.net/xml/schematron">
<pattern name="link pattern">
<rule context="item">
<assert test='count(link) = 3'>There must be 3 link elements.</assert>
<assert test="count(link[@rel = 'self' and @type ='type1']) = 1">There must be 1 link element wwhere @rel='self' and @type='type1'.</assert>
<assert test="count(link[@rel = 'download' and @type ='type2']) = 1">There must be 1 link element where @rel='download' and @type='type2'.</assert>
<assert test="count(link[@rel = 'relatedData' and @type = 'type3']) = 1">There must be 1 link element where @rel='relatedData' and @type='type3'.</assert>
</rule>
</pattern>
</schema>
答案 1 :(得分:1)
查看以下架构是否有帮助
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="item">
<interleave>
<element name="id"><text/>
</element>
<element name="name"><text/></element>
<oneOrMore>
<ref name="link"/>
</oneOrMore>
</interleave>
</element>
</start>
<define name="link">
<element name="link">
<attribute name="href"/>
<choice>
<group>
<attribute name="rel"><value>self</value></attribute>
<attribute name="type"><value>type1</value></attribute>
</group>
<group>
<attribute name="rel"><value>download</value></attribute>
<attribute name="type"><value>type2</value></attribute>
</group>
<group>
<attribute name="rel"><value>relatedData</value></attribute>
<attribute name="type"><value>type3</value></attribute>
</group>
</choice>
</element>
</define>
</grammar>