首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将XSD1.1模式转换为c#类

将XSD1.1模式转换为c#类
EN

Stack Overflow用户
提问于 2015-01-13 14:14:46
回答 1查看 2.6K关注 0票数 3

我必须将XSD1.1模式转换为c#类。问题是,xsd.exe不支持XSD1.1,实际上,如果我试图从该模式创建一个c#类,则会得到以下错误:

注意验证方案:在这个上下文中不支持元素'http://www.w3.org/2001/XMLSchema:assert‘。

我怎么才能避开这一切?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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在哪里添加了不能忽略的特性:

代码语言:javascript
复制
<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:amaxOccurs='0',相应的C#类将包含a成员,不管您是否愿意。这样的降级转换(从XSD1.1到XSD1.0)仍然相对容易组合,以提供这个简单的示例,但当您需要使用这种受限的可选成员和/或通配符在整个继承层次结构中映射粒子时,基本上是不可能的。XSD1.0只是表达不够。

现在是一般性的问题。假设您的模式预先未知并/或大量使用了新的XSD1.1特性。您将无法将它们转换为XSD1.0,因此.NET基类库不会帮助您从它们生成C#类。你还有两三种选择:

  • 您可以手动创建反序列化类。您将无法验证和反序列化,但您将能够反序列化一个有效的文档,包括强制适当的属性默认值(验证的一个典型的副作用,您希望保留)。
  • 您可以创建自己的XSD1.1解析支持。这是一个非常大的项目,尽管您可以忽略很多模式(比如整个XSLT2.0规范中的断言),并且仍然能够得到一些自然的C#类。
  • 您可以使用现有的具有此功能的第三方库。我想,现在有一套空的东西可供选择。Saxon的API不从模式生成反序列化类。我不知道在.NET平台上还有其他任何XSD1.1实现可用。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27924162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档