加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 可以使用相同的名称但不同的属性指定一组无序的元素吗?

发布时间:2020-12-16 07:57:06 所属栏目:百科 来源:网络整理
导读:我正在努力自动化测试获取和返回XML的API,所以我想尽可能地将文档化的API返回数据转换为模式.我基于易用性和学习选择了RelaxNG来完成这项任务. 在我输入所有信息之前,这是一个问题: 是否有可能描述“无序的元素集,具有相同的名称但不同的属性”? 这是我无
我正在努力自动化测试获取和返回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>必须具有’self’链接,’download’链接和’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我得到错误:元素“link”可能出现在“interleave”的多个操作数中.我可以看到它的结果,但我希望它可以将“具有相同名称但不同属性的元素”的概念作为唯一项目来处理.

移动链接refs out interleave得到解析,但是每当订单在返回的数据中发生变化时,我都会等待验证器爆炸.

任何想法,或者这是不可能的?
我正在处理的XML是否存在固有的问题,需要我将其中的一部分移到我的测试应用程序中的更高处理逻辑中(在运行更通用的XML验证后手动检查每个链接类型?)

看起来你在RELAX NG中偶然发现了 restriction on interleave.我会尝试在 Schematron中执行此操作,或者可能是RELAX NG和Schematron的组合.

这是一个片段,用于检查您的< link>使用Schematron版本的元素是supported by Jing:

<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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读