minOccurs ="0"元素上的 C# XSD 验证失败

标签 c# .net xml xsd

我正在针对此 XSD 验证一些 XML:

  <xs:element name="Composite">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="HeldCurrency" type="mstns:HeldCurrencyType"  nillable="true"/>
        <xs:element name="Component" type="mstns:ComponentType" nillable="true" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute  name="Type" type="mstns:compositeType" use="required"/>
    </xs:complexType>x
  </xs:element>

  <xs:complexType name="HeldCurrencyType">
    <xs:attribute  name="CashPerCreationUnit" type="xs:double" />
    <xs:attribute  name="CashCurrency" type="xs:string" />
    <xs:attribute  name="ClosingSpotFx" type="xs:double" />
  </xs:complexType>

  <xs:complexType name="ComponentType">
    <xs:choice>
      <xs:element name="Weight" type="xs:double"/>
      <xs:element name="Units" type="xs:int"/>
    </xs:choice>
    <xs:attribute name="Symbol" type="xs:string" />
  </xs:complexType>

  <xs:simpleType name="compositeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Index" />
      <xs:enumeration value="Etf" />
    </xs:restriction>
  </xs:simpleType>

当我针对它运行以下 XML 时:

<?xml version="1.0"?>
<Composite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Type="Etf" xmlns="urn:xxx-au:index-types">
  <HeldCurrency />
  <Component />
</Composite>

我使用以下代码在 C#/.Net4.0 中运行它:

using (FileStream fileStream = File.OpenRead("./Xml/Components.xsd"))
{
    using (var schemaReader = new XmlTextReader(fileStream))
    {
        settings.Schemas.Add(null, schemaReader);
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationEventHandler += OnValidationEventHandler;

        using (FileStream infile = File.OpenRead(filename))
        {
            using(var xmlReader = XmlReader.Create(infile,settings))
            {
                var serialiser = new XmlSerializer(typeof (Composite));
                _composite = (Composite) serialiser.Deserialize(xmlReader);
            }
        }
    }
}

我收到以下错误: 命名空间“urn:xxx-au:index-types”中的元素“Component”内容不完整。预期的可能元素列表: namespace 中的“重量,单位”。 但是,我有 minOccurs="0"那么为什么这会成为一个问题呢?毕竟序列不包含 ComponentType 元素是合法的,对吧?

提前致谢。

最佳答案

元素 Component 的 minOccurs 是 0 不是它的子元素..

所以试试这个:

  <xs:complexType name="ComponentType">
    <xs:choice>
      <xs:element name="Weight" type="xs:double" minOccurs="0"/>
      <xs:element name="Units" type="xs:int" minOccurs="0"/>
    </xs:choice>
    <xs:attribute name="Symbol" type="xs:string" use="optional"/>
  </xs:complexType>

我将 Weight 和 Units 的出现定义为“0”的地方也将属性设为可选!

关于minOccurs ="0"元素上的 C# XSD 验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13946592/

相关文章:

c# - Azure Blob 存储 | AcquireLeaseAsync,同步等待直到锁释放

c# - 跨断点时出现编译错误

C# 应用程序将文件从 GAC 复制到执行文件夹

.net - 使用 FTDI FTD2xx_NET 检测正确的设备

java - 通过eclipse添加项目到weblogic时出现SAXNotRecognizedException

c# - Asp.net 网站速度非常慢,因为每个页面都有角色 checkin

c# - Java中具有int值的枚举

c# - 如何在 UWP ListView 的最后一列中添加文本框?

xml - 仅变换指定的元素,丢弃其余元素

xml - 使用 SWXMLHash for Swift 遍历 XML 文件