我有一些定義我的對象層次結構的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 感謝對象。
我有一些定義我的對象層次結構的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 感謝對象。
您是否嘗試過LINQ to XSD?項目名稱並沒有真正描述它的目標,所以我應該告訴它它可以替代xsd.exe。
我曾經有一個項目,涉及將DTD文檔轉換爲XSD文檔,然後轉換爲.Net類。 XSD.exe變成了uselness代碼,因爲有一些XSD文檔引用了一個通用的基礎XSD。我最終使用反射的組合來編寫我自己的XSD到.Net生成器來操縱system.xml的內部結構,並通過逆向工程xsd.exe。我花了大約2周時間纔將一臺可行的發電機組合在一起。
沒有理由不能使用相同方法xsd.exe
的用法,但是在將.cs文件寫入磁盤之前,針對生成的CodeDOM模型運行自己的代碼以進行所需的修改。
總的想法是,你加載你的XSD文件到XmlSchema
對象,然後使用內部XmlCodeExporter
和XmlSchemaImporter
類來填充的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()
使用XmlSchemaSet
和XmlResolver
屬性設置爲你寫一個解析器,它會發現導入的模式,並提供他們的XmlSchemaSet
在上面。
導入的模式可能在不同的命名空間中聲明事物,並且如果您希望XmlSerializer
在導入的項目位於不同的命名空間中生成XML,則可能必須將生成的CodeDOM破解爲合理位。
但它是可能的。
祝你好運!
它的[昂貴]商業產品,我不能擔保一種或另一種,但另一種可能性是http://www.liquid-technologies.com/。他們的'xsd-gen'工具支持許多語言,例如Java/C#/ Silverlight甚至C++!值得一看,如果你需要一致支持兩種語言。
注意:他們有一個社區版,但沒有代碼生成功能。
math.xsd和base.xsd之間的依賴關係如何實現?它是有效的XML嗎? – PVitt 2009-08-26 19:12:21