使用XSD我希望能够检查特定组的所有元素是否存在

时间:2014-07-21 18:48:18

标签: xml xsd

让我用下面的例子来帮助解释一下。

有效的XML文档可以包含:

  • 所有group1元素或其中的0个
  • 所有group2元素或其中的0个
  • 所有group1和所有group 2元素,或者恰好其中0个

我不确定自己哪里出错了,我觉得它与xs有关:所有在群组标签中。不过我是制作和使用XSD的新手,所以非常感谢任何帮助。

  <xs:element name="main">
    <xs:complexType>
       <xs:choice maxOccurs="unbounded">
        <xs:group ref="group1" />
        <xs:group ref="group2" />
      </xs:choice>
    </xs:complexType>
  </xs:element>


  <xs:group name="group1">
    <xs:all>
      <xs:element ref="a"  />
      <xs:element ref="b"  />
      <xs:element ref="c"  />
      <xs:element ref="d"  />
      <xs:element ref="e"  />
      <xs:element ref="f"  />
    </xs:all>
  </xs:group>  

  <xs:group name="group2">
    <xs:all>
      <xs:element ref="g"  />
      <xs:element ref="h"  />
      <xs:element ref="i"  />
      <xs:element ref="j"  />
    </xs:all>
  </xs:group>

2 个答案:

答案 0 :(得分:0)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="a" type="xs:string" />
  <xs:element name="b" type="xs:string" />
  <xs:element name="c" type="xs:string" />
  <xs:element name="d" type="xs:string" />
  <xs:element name="e" type="xs:string" />
  <xs:element name="f" type="xs:string" />
  <xs:element name="g" type="xs:string" />
  <xs:element name="h" type="xs:string" />
  <xs:element name="i" type="xs:string" />
  <xs:element name="j" type="xs:string" />

  <xs:group name="group1">
    <xs:sequence>
      <xs:element ref="a" />
      <xs:element ref="b" />
      <xs:element ref="c" />
      <xs:element ref="d" />
      <xs:element ref="e" />
      <xs:element ref="f" />
    </xs:sequence>
  </xs:group>

  <xs:group name="group2">
    <xs:sequence>
      <xs:element ref="g" />
      <xs:element ref="h" />
      <xs:element ref="i" />
      <xs:element ref="j" />
    </xs:sequence>
  </xs:group>

    <xs:complexType name="main">
        <xs:choice maxOccurs="2">
          <xs:group ref="group1" />
          <xs:group ref="group2" />
      </xs:choice>
  </xs:complexType>

</xs:schema>

•您在整个示例中使用了“ref”。这意味着您正在引用全局(定义为'schema'的直接子代)。我将此添加到我的示例中,因此没有对我所指的内容做出任何假设。

•您还提到了群组。如果元素集合一起出现在XML文档的多个位置,则可以将这些元素组合在一起,以便更容易一次引用它们。换句话说,就像你可以创建我在上面提到的全局定义的元素并在整个XML Schema中引用它们一样,你可以命名一个模型组(序列,无序列表或选择,但不是'all'),以及在整个XML Schema中引用该组。再次,我将这些全局定义的(模式的子组)组添加到我的示例中,因此对于我所指的“ref”没有混淆。

•默认的minOccurs和maxOccurs属性值均为1.除了这些默认值(分配给“choice”元素),选项集中只有一个元素可以出现在有效的XML文档中。如果maxOccurs属性的值大于1,则该值确定可能出现的选项数量。你说两种选择都可以出现,所以我把它设置为2.

•使用<xs:all>的一种方法,即允许分组元素处于任何顺序是不使用全局组,只需在每次出现时将它们简单地键入XML模式。我在下面的第二个答案显示了如何克服这一点。

如果我对你感到困惑,请告诉我。 哎呀...不得不解决一个小错字。一切都好了。对不起,我试图快速解决这个问题并搞砸了。杰森

答案 1 :(得分:0)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="main">
      <xs:all>
        <xs:element minOccurs="0" name="group1">
          <xs:complexType>
            <xs:all>
              <xs:element name="a" type="xs:string" />
              <xs:element name="b" type="xs:string" />
              <xs:element name="c" type="xs:string" />
              <xs:element name="d" type="xs:string" />
              <xs:element name="e" type="xs:string" />
              <xs:element name="f" type="xs:string" />
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element minOccurs="0" name="group2">
          <xs:complexType>
            <xs:all>
              <xs:element name="g" type="xs:string" />
              <xs:element name="h" type="xs:string" />
              <xs:element name="i" type="xs:string" />
              <xs:element name="j" type="xs:string" />
            </xs:all>
          </xs:complexType>
        </xs:element>
      </xs:all>
    </xs:complexType>

</xs:schema>  
  • 此技术也符合您的要求,但是这个技术允许您按任意顺序列出每个组中的元素(在此示例中,它们不是组,而是复杂类型)。
  • 这种技术的缺点是现在这些组不是全局的,因此每次需要在整个XML Schema中引用它们时都必须按类似方式键入它们。