2011-08-18 42 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