2008-11-23 86 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++!值得一看,如果你需要一致支持两种语言。

注意:他们有一个社区版,但没有代码生成功能。