从已知的XSD生成.Net对象

3
我有一些定义对象层次结构的XSD文件,例如math.xsd、base.xsd。其中math.xsd依赖于base.xsd。我需要从这些XSD文件中生成类。
我已经了解了这两个工具: CodeXS 工具和 XSD.exe。 xsd.exe的问题在于,我没有成功地从相互依赖的两个XSD文件中生成类。是否有人知道在这种情况下使用xsd.exe的正确参数?
此外,我正在寻找: - 更多工具 - 这些工具之间的比较 - 使用.net 3.5将xsd转换为对象 谢谢。

数学.xsd和基本.xsd之间的依赖关系是如何实现的?它是有效的XML吗? - PVitt
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 属性为一个由你编写的解析器,该解析器将找到导入的架构并在调用 Compile() 时提供给 XmlSchemaSet
导入的架构可能在不同的命名空间中声明内容,如果你希望你的 XmlSerializer 生成带有不同命名空间中导入项的 XML,则可能需要对生成的 CodeDOM 进行一些修改。
但这是可能的。
祝你好运!


1

这是一个[昂贵的]商业产品,我无法保证它的好坏,但另一种可能性是http://www.liquid-technologies.com/。他们的'xsd-gen'工具支持许多语言,如Java/C#/Silverlight甚至C++!如果您需要始终支持两种语言,那么值得一看。

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


0

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


0
我曾经有一个项目,需要将DTD文档转换为XSD文档,然后再转换为.Net类。由于有许多XSD文档引用了一个共同的基础XSD,所以XSD.exe生成的代码是无用的。最终我使用反射来操作system.xml的内部,并通过逆向工程xsd.exe编写了自己的XSD到.Net生成器。花费了我大约两周时间才拼凑出一个可行的生成器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接