2008-11-23 81 views
3

我有一些定義我的對象層次結構的XSD-s。例如math.xsd,base.xsd ,而math.xsd取決於base.xsd。我需要從這些xsd-s生成類。從已知的XSD生成.Net對象

我已經閱讀過這兩種工具: CodeXS工具和XSD.exe。 xsd.exe的問題是我沒有成功從兩個互相依賴的xsd-s生成類。有沒有人知道在這種情況下使用xsd.exe的正確參數?

而且,我要找: - 更多工具 - 這些工具 之間的比較 - XSD使用.net 3.5 感謝對象。

+0

math.xsd和base.xsd之間的依賴關係如何實現?它是有效的XML嗎? – PVitt 2009-08-26 19:12:21

回答

0

您是否嘗試過LINQ to XSD?項目名稱並沒有真正描述它的目標,所以我應該告訴它它可以替代xsd.exe。

0

我曾經有一個項目,涉及將DTD文檔轉換爲XSD文檔,然後轉換爲.Net類。 XSD.exe變成了uselness代碼,因爲有一些XSD文檔引用了一個通用的基礎XSD。我最終使用反射的組合來編寫我自己的XSD到.Net生成器來操縱system.xml的內部結構,並通過逆向工程xsd.exe。我花了大約2周時間纔將一臺可行的發電機組合在一起。

3

沒有理由不能使用相同方法xsd.exe的用法,但是在將.cs文件寫入磁盤之前,針對生成的CodeDOM模型運行自己的代碼以進行所需的修改。

總的想法是,你加載你的XSD文件到XmlSchema對象,然後使用內部XmlCodeExporterXmlSchemaImporter類來填充的CodeDOM命名空間。

完成之後,您可以自由地對CodeDOM AST進行任何調整,然後將其寫入磁盤。

例如,

XmlSchema schema = null; // Load XSD file here 
    var schemas = new XmlSchemas(); 
    schemas.Add(schema); 

    var ns = new CodeNamespace { Name = "MyNamespace" }; 

    ns.Imports.Add(new CodeNamespaceImport("System")); 
    ns.Imports.Add(new CodeNamespaceImport("System.Collections.Generic")); 

    var exporter = new XmlCodeExporter(ns); 
    var importer = new XmlSchemaImporter(schemas); 

    foreach (XmlSchemaElement element in schema.Elements.Values) 
    { 
    var mapping = importer.ImportTypeMapping(element.QualifiedName); 
    exporter.ExportTypeMapping(mapping); 
    } 

    // Transform CodeDOM as required, adding new attributes, methods, modifying 
    // inheritance hierarchy, whatever. 

    var provider = new CSharpCodeProvider(); 
    using (var writer = new StreamWriter(outputFile, false)) 
    provider.GenerateCodeFromNamespace(ns, writer, new CodeGeneratorOptions()) 

如果你的架構引用其他模式,你必須在調用Compile()使用XmlSchemaSetXmlResolver屬性設置爲你寫一個解析器,它會發現導入的模式,並提供他們的XmlSchemaSet在上面。

導入的模式可能在不同的命名空間中聲明事物,並且如果您希望XmlSerializer在導入的項目位於不同的命名空間中生成XML,則可能必須將生成的CodeDOM破解爲合理位。

但它是可能的。

祝你好運!

1

它的[昂貴]商業產品,我不能擔保一種或另一種,但另一種可能性是http://www.liquid-technologies.com/。他們的'xsd-gen'工具支持許多語言,例如Java/C#/ Silverlight甚至C++!值得一看,如果你需要一致支持兩種語言。

注意:他們有一個社區版,但沒有代碼生成功能。