如何根据'type'属性值要求一个元素?

时间:2016-04-30 05:30:44

标签: xml xsd jaxb xsd-validation xml-validation

我正在尝试为以下XML构建XSD,并且我正在使用JAXB通过验证解组到Java Object。

验证规则是<JobParam>type = jobTypetype = customer中的前2个元素是必需的。 JobParam中的所有其他人都是可选的。

如何为此创建XSD?

<job>
    <jobName>core</jobName>
    <jobParams>
         <jobParam type="jobType">Scheduler</jobParam>
         <jobParam type="customer">Alphabet</jobParam>
         <jobParam type="mode">music</jobParam>
      </jobParams>
</job>

1 个答案:

答案 0 :(得分:1)

您无法在XSD 1.0中表达验证规则。您必须使用Java对照JAXB创建的对象,或者转到XSD 1.1,您可以使用断言或条件类型赋值。

但是,最好的解决方案是修复XML设计:

  • 无需在子项名称中重复父名称。 [次要]
  • 如果元素类型是名称的一部分而不是属性值,则可以使用简单的XSD 1.0出现约束来表示验证规则。 [专业]

以上是对您的XML进行的上述改进:

<job>
    <name>core</name>
    <params>
         <type>Scheduler</type>
         <customer>Alphabet</customer>
         <mode>music</mode>
     </params>
</job>

您可能会考虑的其他两项改进:

  1. 删除params包装器,将其子级提升为job的子级。
  2. 如果您真的必须支持XSD设计时未知的参数,请添加customParams包装。
  3. 例如:

    <job>
        <name>core</name>
        <type>Scheduler</type>
        <customer>Alphabet</customer>
        <customParams>
           <customParam type="mode">music</customParam>
        </customParams>
    </job>
    

    通过XSD 1.0中的基本出现限制,可以简单地将此问题与关于customermode的验证规则一起表示。