Xml 在xsd中,如何重新声明所选的不同组元素

Xml 在xsd中,如何重新声明所选的不同组元素,xml,xsd,Xml,Xsd,我有以下两个要素,产品和客户帐户 该产品具有以下结构,包含两个元素:productSerialNumber和serviceGuidingIdentifer <xs:element name="product"> <xs:complexType> <xs:sequence> <xs:element name="productSerialNumber" type="xs:string" /> <xs:element

我有以下两个要素,产品和客户帐户

该产品具有以下结构,包含两个元素:productSerialNumber和serviceGuidingIdentifer

<xs:element name="product">
  <xs:complexType>
   <xs:sequence>
     <xs:element name="productSerialNumber" type="xs:string" />
     <xs:element name="serviceGuidingIdentifer">
       <xs:complexType>
         <xs:sequence>
             <xs:element name="ID" type="xs:string" />
             <xs:element name="type" type="xs:string" />
         </xs:sequence>
       </xs:complexType>
    </xs:element> 
  </xs:sequence>                                                                     
 </xs:complexType>
</xs:element>

客户帐户具有以下结构

<xs:element name="customerAccount">
  <xs:complexType>
      <xs:sequence>
        <xs:element name="ID"type="xs:string" />
      </xs:sequence>
  </xs:complexType>

现在我想有一个选择,用户只能声明上面三个元素中的一个,即 1) 产品序列号 或 2) 服务指南标识符 或 3) 客户帐户

每当我试图声明选择时,我都会遇到这样的错误:要么元素未找到,要么元素定义不一致

我尝试了以下选择声明

<xs:choice>
    <xs:element ref="tns:productSerialNumber"/>
    <xs:element ref="tns:serviceGuidingIdentifer"/>
    <xs:element ref="tns:customerAccount"/>
</xs:choice>

在选项中重新声明不同组元素的正确方法是什么

任何帮助都将不胜感激

感谢和问候,
Dev

至少有两个元素不是顶级元素,因此不能“引用”它们。以下架构有效(在Eclipse中):


至少有两个元素不是顶级元素,因此不能“引用”它们。以下架构有效(在Eclipse中):


如果将它们定义为复杂类型,则可以改为ref类型

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Scratch.Product" targetNamespace="http://Scratch.Product" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="product">
          <xs:complexType>
            <xs:sequence>
              <xs:choice minOccurs="0">
                <xs:element name="productSerialNumber" type="xs:string" />
                <xs:element name="serviceGuidingIndetifier" type="serviceGuidingIdentiferType" />
                <xs:element name="customerAccount" type="customerAccountType" />
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="serviceGuidingIdentiferType">
    <xs:sequence>
      <xs:element name="ID" type="xs:string" />
      <xs:element name="type" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="customerAccountType">
    <xs:sequence>
      <xs:element name="ID" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

如果将它们定义为复杂类型,则可以改为ref类型

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Scratch.Product" targetNamespace="http://Scratch.Product" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="product">
          <xs:complexType>
            <xs:sequence>
              <xs:choice minOccurs="0">
                <xs:element name="productSerialNumber" type="xs:string" />
                <xs:element name="serviceGuidingIndetifier" type="serviceGuidingIdentiferType" />
                <xs:element name="customerAccount" type="customerAccountType" />
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="serviceGuidingIdentiferType">
    <xs:sequence>
      <xs:element name="ID" type="xs:string" />
      <xs:element name="type" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="customerAccountType">
    <xs:sequence>
      <xs:element name="ID" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>


需要注意的是,任何顶级元素都可以有效地用作基于该架构的文档中的根元素,这可能是OP想要的,也可能不是OP想要的。感谢您的快速回复。令人伤心的是,我正在使用soapUI,它在加载期间抛出一个错误,对中的所有引用都说“element not found”。我认为在解析时没有考虑名称空间。我们将使用soapUI,所以我不太确定是什么让UI正确解析它。需要注意的是,任何顶级元素都可以有效地用作基于该架构的文档中的根元素,这可能是OP想要的,也可能不是OP想要的。感谢您的快速回复。令人伤心的是,我正在使用soapUI,它在加载期间抛出一个错误,对中的所有引用都说“element not found”。我认为在解析时没有考虑名称空间。我们将使用soapUI,所以我不太确定是什么让UI正确地解析它