添加 maxOccurs 指示器后,为什么此 xml 架构对于 .NET 数据集变得无效?

问题描述 投票:0回答:1

将下面的 xml 传递给 C# 程序中的 DataSet.ReadXml 函数(使用 .NETFramework v4.8)时,该函数会抛出异常,指示

foo
的声明重复(“重复声明 'foo'”)。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="container" type="containerType"/>
  <xs:complexType name="containerType">
    <xs:sequence>
      <xs:element name="A" type="AType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="B" type="BType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="AType">
    <xs:sequence>
      <xs:element name="foo" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="BType">
    <xs:sequence>
      <xs:element name="foo" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

从 foo 中删除 maxOccurs 指示器可以以某种方式消除错误。即该 xml 被函数接受

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="container" type="containerType"/>
  <xs:complexType name="containerType">
    <xs:sequence>
      <xs:element name="A" type="AType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="B" type="BType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="AType">
    <xs:sequence>
      <xs:element name="foo" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="BType">
    <xs:sequence>
      <xs:element name="foo" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

如果这个版本有效,为什么之前的版本无效?

我尝试阅读 Microsoft 的该功能文档,但没有找到任何相关的内容。

我还尝试更改 maxOccurs 的值。仅当使用默认值 1 时才接受 xml。

更改其中一个

foo
的名称将消除错误并保留 maxOccurs,当然,但这并不能回答为什么存在错误的问题。另外,我有兴趣知道是否有不同的解决方法。

编辑: 请求的 C# 验证代码 :

using System;
using System.Data;
using System.Windows.Forms;
static class Program
{
   static void Main()
   {
      OpenFileDialog ofd = new OpenFileDialog();
      if (ofd.ShowDialog() == DialogResult.OK)
      {
         var ds = new DataSet();
         try
         {
            //Throws if given a file containing the first schema example
            ds.ReadXml(ofd.FileName);
         }
         catch (Exception ex)
         {
            MessageBox.Show(ex.Message);
         }
      }
   }
}
c# xml xsd
1个回答
0
投票

您提供的架构文档是有效的 XSD 架构,Saxon 接受它为有效。该问题似乎是 Microsoft 的 DataSet 类的限制。我在文档中看到以下注释:

如果您的数据集的架构包含同名的元素,但是 不同的类型,在同一个命名空间中,当你 尝试通过指定使用 ReadXml 将架构读入 DataSet XmlReadMode.ReadSchema。如果您使用的是,则不会发生此异常 .NET Framework 版本 1.0。

我不知道你如何解决这个问题:这取决于你在项目中想要实现的目标以及为什么选择这种特定的技术来实现它。

© www.soinside.com 2019 - 2024. All rights reserved.