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

Xml 使用XSD,我希望能够检查特定组的所有元素是否存在,xml,xsd,Xml,Xsd,让我用下面的例子来帮助解释 有效的XML文档可以具有: 所有group1元素,或者正好是其中的0个元素 所有group2元素,或者正好是其中的0个元素 所有的组1和组2元素,或者正好是其中的0个 我不确定哪里出了问题,我觉得这与xs:all-in-group标签有关。不过,我对制作和使用XSD还不熟悉,所以非常感谢您的帮助 <xs:element name="main"> <xs:complexType> <xs:choice maxOcc

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

有效的XML文档可以具有:

所有group1元素,或者正好是其中的0个元素 所有group2元素,或者正好是其中的0个元素 所有的组1和组2元素,或者正好是其中的0个 我不确定哪里出了问题,我觉得这与xs:all-in-group标签有关。不过,我对制作和使用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>
•您在整个示例中使用了“ref”。这意味着您引用的是定义为“schema”的直接子级的全局对象。我把这个添加到我的例子中,所以对于我所指的内容没有任何假设

•您还提到了团体。如果一组元素一起出现在XML文档中的多个位置,则可以将这些元素组合在一起,以便于一次引用所有元素。换句话说,与创建上面提到的全局定义元素并在整个XML模式中引用它们的方式相同,您可以命名模型组序列、无序列表或选项(但不是“全部”),并在整个XML模式中引用该组。同样,我在我的示例中添加了“模式组”的这些全局定义的子项,这样就不会混淆我所指的“ref”

•默认的minOccurs和maxOccurs属性值均为1。如果将这些默认值指定给“choice”元素,则在有效的XML文档中只能出现选项集中的一个元素。如果maxOccurs属性的值大于1,则该值确定可能出现的选项数量。您说过两个选项都可以显示,所以我将该值设置为2

•一种允许分组元素按任意顺序排列的使用方法是不使用全局组,每次出现时都将其简单地键入XML模式。下面我的第二个答案显示了如何克服这一问题

如果我把你弄糊涂了,请告诉我。 哎呀。。。不得不修正一个小的排字错误。现在好多了。很抱歉,我想快点把事情搞糟。杰森

<?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模式中引用它们时,都必须像这样键入它们。
您不需要maxOccurs=1或minOccurs=1,这些是默认值。如果有人在我大约一小时后回家的时候还没有给你打一个例子,我会把它贴出来。我没有忘记。妻子接我时带我出去了。快到家了你真幸运,期待着答案。谢谢杰森,我想这就是我想要的。然而,我对顺序的理解是,这些项目必须按照指定的顺序发生。我想要的是每个组中的元素出现一次,但可以是任何顺序,这就是为什么我认为xs:all最合适的原因。i、 组1中元素的顺序可能是b、d、a、c、e、f,这很好。如果你能发布一个使用它的示例,那将非常有用。我不太明白,在一个标记中输入它们后,仍然会留下两个定义的组,每个组都可以有它们或没有它们。这难道不意味着元素a-f必须有一个父标记,并且标记中的g-j也必须有类似的父标记吗?是的,这正是它的意思。如果使用“ref”引用全局组,则不能在“all”标记中定义这些组。等等,我还有一个想法,但我不确定,所以我必须先测试一下。我的想法失败了。您必须全局定义模式的子组,并且不能在复杂类型中嵌套两个背靠背的“所有”组。使用.XSD文件,您必须有某种方法来定义组,可以使用'group'标记,也可以将它们分组为另一个复杂类型的子类示例2。要做任何更复杂的事情,除了.XSD之外,很可能还需要使用另一种名为Schematron的验证技术。这个名字很有趣,但它是一个ISO标准。在使用XSD进行验证之前,您可以尝试通过应用XSLT转换对原始XML中的元素重新排序。这将允许您使用第一个使用组/序列的示例。下面是一篇关于使用XSLT对XML元素重新排序的文章。谢谢你的帮助,杰森,到时候我得重新考虑我的方法了。我可能会更深入地研究这个问题,或者使用多个模式来完成我需要完成的任务。干杯
<?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>