java - XSD xs :choice shouldn't allow empty choice

标签 java c# xml xsd

我的 XSD 有问题。我的 XSD 包含一个 xs:choice 来实现选择其中一种类型的选项。不允许选择无类型(或 Null)!

<xs:complexType name="TypeAndValue">
<xs:choice minOccurs="1">
  <xs:element minOccurs="1" name="SimpleType" nillable="false" type="SimpleDataTypeAndValue" />
  <xs:element minOccurs="1" name="ArrayType" nillable="false"  type="ArrayTypeAndValue" />
  <xs:element minOccurs="1" name="ListType"  nillable="false"  type="ListTypeAndValue" />
  <xs:element minOccurs="1" name="ClassType" nillable="false" type="IdentifierTypeAndValue" />
</xs:choice>

我已经通过 xsd.exe 从 xsd 创建了一个 .cs 文件。这工作正常,没有错误。但是如果我尝试这样的 XML 文件,XML 将被接受:

<?xml version="1.0"?>
<Block xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Class Identifier="Test">
      <Declaration Identifier="List">
        <TypeAndValue>
        </TypeAndValue>
      </Declaration>
    </Class>
</Block>

我已经尝试选择 minOccurs="1"nillable="false" 元素,但 Schema 接受空的 TypeAndValue block 。

难道我需要修改cs文件?

编辑: 这是完整的 XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Block" nillable="true" type="Block" />
  <xs:complexType name="Block">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Class" nillable="true" type="Class" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Class">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Declaration" nillable="true" type="Declaration" />
    </xs:sequence>
    <xs:attribute name="Accessmodifier" type="Accessmodifier" />
    <xs:attribute name="Identifier" type="xs:string" use="required"/>
  </xs:complexType>
  <xs:complexType name="Declaration">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Modifier" nillable="true" type="Modifier" />
      <xs:element minOccurs="1" maxOccurs="1" name="TypeAndValue" type="TypeAndValue" />
    </xs:sequence>
    <xs:attribute name="Accessmodifier" type="Accessmodifier" />
    <xs:attribute name="Identifier" type="xs:string" use="required" />
  </xs:complexType>
  <xs:simpleType name="Modifier">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Static"/>
      <xs:enumeration value="Constant"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="Accessmodifier">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Public"/>
      <xs:enumeration value="Private"/>
      <xs:enumeration value="Internal"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="SimpleDataTypeAndValue">
    <xs:attribute name="Type"  type="SimpleType" use="required"/>
    <xs:attribute name="Value" type="xs:string" />
  </xs:complexType>
  <xs:complexType name="IdentifierTypeAndValue">
    <xs:attribute name="Type" type="xs:string"/>
  </xs:complexType>
  <xs:complexType name="ArrayTypeAndValue">
    <xs:choice>
        <xs:element minOccurs="1" maxOccurs="1" name="Dimension" type="ArrayDimension" />
        <xs:element minOccurs="1" maxOccurs="1" name="DataInitialization" type="ArrayDataInitialization" />
    </xs:choice>
    <xs:attribute name="Type" type="SimpleType" use="required"/>
  </xs:complexType>
  <xs:complexType name="ArrayDimension">
    <xs:attribute name="Amount" type="xs:int" use="required"/>
  </xs:complexType>
  <xs:complexType name="ArrayDataInitialization">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Value" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ListTypeAndValue">
     <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Value" type="xs:string" />
     </xs:sequence>
     <xs:attribute name="Type" type="SimpleType" use="required" />
  </xs:complexType>
  <xs:complexType name="TypeAndValue">
    <xs:choice minOccurs="1">
      <xs:element minOccurs="1" name="SimpleType" nillable="false" type="SimpleDataTypeAndValue" />
      <xs:element minOccurs="1" name="ArrayType" nillable="false"  type="ArrayTypeAndValue" />
      <xs:element minOccurs="1" name="ListType"  nillable="false"  type="ListTypeAndValue" />
      <xs:element minOccurs="1" name="ClassType" nillable="false" type="IdentifierTypeAndValue" />
    </xs:choice>
  </xs:complexType>
  <xs:simpleType name="SimpleType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Int"/>
      <xs:enumeration value="Float"/>
      <xs:enumeration value="Double"/>
      <xs:enumeration value="Bool"/>
      <xs:enumeration value="String"/>
      <xs:enumeration value="Char"/>
      <xs:enumeration value="Byte"/>
      <xs:enumeration value="Short"/>
      <xs:enumeration value="Long"/>
      <xs:enumeration value="Date"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="Class" nillable="true" type="Class" />
  <xs:element name="Declaration" nillable="true" type="Declaration" />
</xs:schema>

最佳答案

您的 XML 实际上对您的 XSD 有效:

[Error] try.xml:9:24: cvc-complex-type.2.4.b: The content of element 'TypeAndValue' is not complete. One of '{SimpleType, ArrayType, ListType, ClassType}' is expected.

由于这符合您的预期,您应该怀疑您验证 XML 所使用的方法。确保您使用的是验证解析器并且验证已打开。

关于java - XSD xs :choice shouldn't allow empty choice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33650591/

相关文章:

javascript - 如何为 Zidoo Digital Android Box 检测连接或断开连接的 HDMI 状态?

java - 尝试在java项目中执行唯一性?

c# - 使用 LINQ 按字母搜索

html - 如何在 Jenkins/JUNIT xml 中的 <system-out> 或 <failure> 标签中添加 href 链接

xml - 根据 XSD 模式验证 XML 并使用 groovy 捕获验证器期望

java - leet Java程序中的非法转义

java - 如何进行单元测试以检查日期时间的格式?

C#进程重启循环

c# - ASP.NET:功能键快捷方式?

javascript - XML 中的正则表达式替换