DataContractSerializer元数据导出。相关模式

时间:2011-11-10 13:17:10

标签: import xsd schema datacontractserializer svcutil.exe

我正在使用svcutil.exe导出程序集的datacontracts。它会生成一组xsd文件,包括彼此:

<xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
  <xs:import namespace="http://schemas.datacontract.org/2004/07/System.Reflection" />
  <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
  <xs:import namespace="http://schemas.datacontract.org/2004/07/System" />
  <xs:import namespace="http://schemas.datacontract.org/2004/07/UBP.Business.Core" />
  <xs:import namespace="http://schemas.datacontract.org/2004/07/UBP.Core" />
  <xs:import namespace="http://schemas.datacontract.org/2004/07/UBP.Collection" />
  <xs:import namespace="http://schemas.datacontract.org/2004/07/System.Data" />

在我看来,这个util假设所有模式都在服务器上出现,每个模式都可以通过指定的超链接访问。但是,如果我在Altova XMLSpy中单独打开每个模式,它将报告无法找到导入模式的错误。所以我的问题是如何发布生成的模式,以便所有模式彼此可见?或许还有其他一些选择?

1 个答案:

答案 0 :(得分:1)

生成的模式不是通过超链接相互引用,而是通过相对路径引用。您应该找到的是其中一个模式文件将是“主”模式文件,并且只要存在所有模式文件,当您在XMLSpy中打开它时,将解析其他模式的所有相对路径,并且模式应该开好了。

<强>更新

我原来的答案实际上是误导性的,事实上是不正确的。模式中没有定义相对路径。这些文件通过名称空间相互引用。

因此,通过包含对类型命名空间的引用,可以在另一个模式中使用在一个模式中定义的类型。

忘掉我说的其他一切(所有相对路径的东西都是废话,当我回答时我并没有直接思考 - 为此道歉)。

因为您从定义了许多相互依赖类型的程序集生成这些模式,所以生成的包含这些类型的XSD等价物的模式也具有高度的相互依赖性,因此所有的import语句都是如此。

但是,通过引用这些命名空间,您可以创建新的XSD架构,这些架构利用这些生成的架构中定义的类型。

您询问的命名空间(http://schemas.microsoft.com/2003/10/Serialization/)不涉及资源;相反,它允许重用在此命名空间下定义的类型。您可能会在架构的根目录中看到相应的 xmlns 属性,该属性将定义从此命名空间引用类型时要使用的前缀。

我希望这很清楚。