3

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

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

此外,我正在寻找: - 更多工具 - 这些工具之间的比较 - xsd to object using .net 3.5 谢谢。

4

5 回答 5

3

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

一般的想法是将 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())

如果您的架构引用其他架构,您必须使用XmlSchemaSet,并将XmlResolver属性设置为您编写的解析器,它将找到导入的架构并XmlSchemaSet在您调用Compile()它时将它们提供给您。

导入的模式可以在不同的命名空间中声明事物,如果您希望XmlSerializer在不同的命名空间中使用导入的项目生成 XML,您可能需要稍微修改生成的 CodeDOM。

但这是可能的。

祝你好运!

于 2009-08-22T01:46:06.943 回答
1

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

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

于 2009-12-15T01:21:52.307 回答
0

不久前我有一个项目,涉及将 DTD 文档转换为 XSD 文档,然后转换为 .Net 类。XSD.exe 变成了无用代码,因为有许多 XSD 文档引用了一个通用的基本 XSD。我最终编写了自己的 XSD 到 .Net 生成器,使用反射的组合来操纵 system.xml 的内部,并通过逆向工程 xsd.exe。我花了大约 2 周的时间来破解一个可行的生成器。

于 2009-08-20T05:03:17.653 回答
0

您是否尝试过LINQ to XSD?项目名称并没有真正描述它的目标,所以我应该说它是 xsd.exe 的有用替代品。

于 2009-08-19T20:00:17.900 回答