Xsd 如何在XML模式中指定两个字段中的任何一个必须存在?

Xsd 如何在XML模式中指定两个字段中的任何一个必须存在?,xsd,Xsd,我想指定fieldname或freetext必须始终存在于应用于此XSD的XML文件中。有办法吗 <xs:complexType name="tSome"> <xs:sequence> <!-- either one of the two below has to be present. --> <xs:element name="fieldname" type="xs:string" /> <xs:element name="f

我想指定
fieldname
freetext
必须始终存在于应用于此XSD的XML文件中。有办法吗

<xs:complexType name="tSome">
<xs:sequence>
  <!-- either one of the two below has to be present. -->
  <xs:element name="fieldname" type="xs:string" />
  <xs:element name="freetext" type="xs:string" />
  <!-- this one below must always be present -->
  <xs:element name="dbtablename" type="xs:string" />
</xs:sequence>
</xs:complexType>

XML模式中有一个,允许您获取其中一个包含的元素,但不能获取两个或更多。如果您想要3个中的任意2个,我建议您这样做:

<xs:choice>
  <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:choice>
<xs:choice>
  <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:choice>

那么,您想要
fieldname
freetext
而不是两者?或者两者兼而有之?然后选择
dbtablename

以下是1或2个元素:

<xs:choice minOccurs="1" maxOccurs="2">
    <xs:element name="fieldname" type="xs:string"/>
    <xs:element name="freetext" type="xs:string"/>
    <xs:element name="dbtablename" type="xs:string"/>
</xs:choice>


这是你想要的吗?还是希望将
dbtablename
分开?

非常感谢!必须尝试l8r minoccurs和maxoccurs如何与choice一起工作。尽管我不需要你的例子,但如果答案有效,我会接受。干杯抱歉:周末发生了:fieldname或freetext,而不是两者。dbtablename始终为空。请参阅我编辑的原始问题(为什么有minOccurs标记)。我现在的问题是:既然它有minOccurs标记,那么它现在真的是“fieldname还是freetext,而不是两者都有”吗。这又是我的错误。问题但您不认为应该删除它们吗?@matti可以删除它们,因为minOccures=“0”不起任何作用。@matti如果您不希望元素被指定两次或多次,您可以添加maxOccurs=“1”。@draco:'相反,您可以添加maxOccurs=“1”,如果您不希望元素被指定两次或更多次,您是什么意思?maxOccurs=1是默认值,这意味着在xml文件中,标记/元素最多可以出现一次。在选择的情况下,默认值为minOccurs=“0”和maxOccurs=“0”。抱歉:周末发生:fieldname或freetext。dbtablename始终为空。选择的问题是xsd.exe会为它生成奇怪的代码。这里minOccurs=“1”maxOccurs=“2”是什么意思?选择上的min/max表示需要1个或2个元素。这不是你想要的,德拉科的答案更接近你想要的。大多数xsd编译器生成一些奇怪的代码供选择。我使用Jax-B2,我可以接受。无论如何,谢谢!Jax-B2是用于Java的,我需要C#类生成器。必须尝试WSCF(用于WSDL->Classes),因为它也有.xsd生成选项。@minOccurs/maxOccurs属性是这样工作的吗?我的印象是,它们可能适用于所选元素,而不是选择集中允许的元素数量。(根据W3中的定义:
XMLSchema选择元素只允许声明中包含的一个元素出现在包含元素中。
([))我真的很抱歉,但是前面的minOccurs标记存在,因为我的选择实现是fieldname和freetext只是可选的。
<xs:choice minOccurs="1" maxOccurs="2">
    <xs:element name="fieldname" type="xs:string"/>
    <xs:element name="freetext" type="xs:string"/>
    <xs:element name="dbtablename" type="xs:string"/>
</xs:choice>