2011-08-18 63 views
2

我是C#developpment中的新成员,我想知道为每个XSD架构获取一个CS文件的过程。如何获取用于xml架构的cs文件(xsd)

我有3个xsd文件(A.xsd,B.xsd和Common.xsd)。 A和B都具有Common作为导入。我试过“xsd.exe”和“xsd2code.exe”,但没有成功。因为没有复杂类型的顶级元素被发现为“Common.xsd”

  • “XSD.EXE”

    1. 不能产生类。
    2. 生成文件“A.cs”和“B.cs”,但“Common.xsd”代码位于每个文件中。
  • “xsd2code.exe”

    1. “Common.cs” 都很好,我选择 “MyNamespace.Common” 的命名空间中产生。
    2. 由于未指定类型而无法生成其他文件,但是我使用“MyNamespace.Common”作为自定义usings(“/ cu”选项)。

是否有人有想法?

在此先感谢。

回答

3

您需要引用导入或包含链中的所有模式。

试试这个:

xsd /c A.xsd B.xsd Common.xsd 

编辑:但是这将意味着所有的类都在一个文件中。

如果你希望他们拆分到不同的文件,你有两种选择:

  1. 手动将其剥离出来。我知道这是一个生成的文件,但如果你的源模式相当静态,那么这是一个一次性的练习。
  2. 改为使用svcutil.exe。然而,这要复杂得多,实际上你可能甚至无法做到这一点,除非你的模式都遵守了某些准则。如果您有兴趣,请参阅下面的流程。

如果你看中的选项2上方,然后在这里的一般过程是:

  1. 使用/ dconly国旗SvcUtil工具从Common.xsd提取类型。这将生成一个使用常见类型的类文件。
  2. 将此类编译为程序集
  3. 使用/ r标志和引用CommonTypes.dll程序集从A.xsd中提取类型。
  4. 对B做同样的事情。xsd

但是,此方法基于使用DataContractSerializer执行工作的svcutil,因为/ r标志不可用于XmlSerializer。如果你的模式遵守相当严格的DCS规则(这里可以找到:http://msdn.microsoft.com/en-us/library/ms733112.aspx),这只会起作用。

如果不遵守这些规则,则svcutil将回退到使用不支持/ r标志的XmlSerializer。

希望这会有所帮助。

+0

好吧,它的工作原理,但所有都在一个文件。我的目标是每个模式都有一个cs文件。 – Bref

+0

已扩展的答案请参阅。 –

+0

我已经想过你的第一选择。但是,从我的观点来看,自动操作之后的手动操作很棘手。事实上,你的第二个选择更加合理,但工作得很好。你的过程帮助我,并为此感谢很多。 – Bref