从已知的XSD生成.Net对象

时间:2008-11-23 14:10:33

标签: .net-3.5 xsd

我有一些XSD-s定义我的对象层次结构。例如math.xsd,base.xsd math.xsd取决于base.xsd。我需要从那些xsd-s生成类。

我已经阅读过这两个工具: CodeXS工具和XSD.exe。 xsd.exe的问题是我没有成功从两个相互依赖的xsd-s生成类。有谁知道在这种情况下使用xsd.exe的正确参数?

此外,我正在寻找:   - 更多工具   - 这些工具之间的比较   - 使用.net 3.5对象的xsd 感谢。

5 个答案:

答案 0 :(得分:3)

没有理由不能使用xsd.exe使用相同的方法,但是在生成的CodeDOM模型上运行自己的代码,以便在将.cs文件写入磁盘之前进行所需的修改。

一般的想法是将XSD文件加载到XmlSchema对象中,然后使用内部XmlCodeExporterXmlSchemaImporter类来填充CodeDOM名称空间。

完成后,您可以自由地对CodeDOM AST进行任何调整,然后将其写入磁盘。

EG。

  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())

如果您的模式引用其他模式,则必须使用XmlSchemaSet,并将XmlResolver属性设置为您编写的解析程序,这将找到导入的模式并将其提供给{ {1}}当您致电XmlSchemaSet时。

导入的模式可以在不同的命名空间中声明事物,如果您希望Compile()使用不同命名空间中的导入项生成XML,则可能需要对生成的CodeDOM进行一些修改。

但这是可能的。

祝你好运!

答案 1 :(得分:2)

答案 2 :(得分:1)

它是一种[昂贵的]商业产品,我不能以某种方式担保,但另一种可能性是http://www.liquid-technologies.com/。他们的'xsd-gen'工具支持许多语言,如Java / C#/ Silverlight甚至C ++!值得一看,如果你需要一致支持两种语言。

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

答案 3 :(得分:0)

你试过LINQ to XSD吗?项目名称并没有真正描述它的目标,所以我应该告诉它对xsd.exe有用。

答案 4 :(得分:0)

我前段时间有一个项目涉及将DTD文档转换为XSD文档,然后转换为.Net类。 XSD.exe结果是uselness代码,因为有许多XSD文档引用了公共基础XSD。我最终使用反射的组合来编写我自己的XSD到.Net生成器,以操纵system.xml的内部和反向工程xsd.exe。我花了大约两个星期的时间来破解一个可行的发电机。