我必须将XSD1.1模式转换为c#类。问题是,xsd.exe不支持XSD1.1,实际上,如果我试图从该模式创建一个c#类,则会得到以下错误:
注意验证方案:在这个上下文中不支持元素'http://www.w3.org/2001/XMLSchema:assert‘。
我怎么才能避开这一切?
发布于 2015-04-14 15:17:22
没有简单的方法可以绕过这件事。
定制xsd.exe行为通常是可能的,甚至很容易。它只是.NET库(System.Xml)之上的一个薄薄的层。但是这些库不理解XSD1.1,因此您必须有一个XSD1.0文档来满足它们。如果您可以将模式转换为旧的规范语言,那么您也可以使用未经修改的xsd.exe。
您能将XSD1.1模式转换为XSD1.0模式吗?在某些情况下,这可能很容易。例如,一个非常简单的XSLT转换可以过滤掉断言,用合适的XSD1.0数据类型替换新的数据类型等等。然而,一般情况是介于困难和无法解决之间。让我们看看XSD1.1在哪里添加了不能忽略的特性:
<complexType name="base">
<complexContent>
<sequence>
<element ref="tns:a" minOccurs="0" maxOccurs="1"/>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:b"/>
<element ref="tns:c"/>
</choice>
</sequence>
</complexContent>
</complexType>
<complexType name="derived">
<complexContent>
<restriction base="tns:base">
<sequence>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:b"/>
<element ref="tns:c"/>
</choice>
</sequence>
</restriction>
</complexContent>
</complexType>(从这里采集的样品。这是一个很好的起点,可以估计您的特定模式是否可以在XSD1.0中表示或转换为XSD1.0。)
该示例显示了在XSD1.1中很自然地使用了继承。派生类型真正做的就是禁止成员tns:a。要在XSD1.0中做同样的事情,类型需要列出带有tns:a的maxOccurs='0',相应的C#类将包含a成员,不管您是否愿意。这样的降级转换(从XSD1.1到XSD1.0)仍然相对容易组合,以提供这个简单的示例,但当您需要使用这种受限的可选成员和/或通配符在整个继承层次结构中映射粒子时,基本上是不可能的。XSD1.0只是表达不够。
现在是一般性的问题。假设您的模式预先未知并/或大量使用了新的XSD1.1特性。您将无法将它们转换为XSD1.0,因此.NET基类库不会帮助您从它们生成C#类。你还有两三种选择:
https://stackoverflow.com/questions/27924162
复制相似问题