我有一些定义我的对象层次结构的 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 谢谢。
您没有理由不能使用相同的方法xsd.exe
,然后针对生成的 CodeDOM 模型运行您自己的代码,以在将 .cs 文件写入磁盘之前进行所需的修改。
一般的想法是将 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())
如果您的架构引用其他架构,您必须使用XmlSchemaSet
,并将XmlResolver
属性设置为您编写的解析器,它将找到导入的架构并XmlSchemaSet
在您调用Compile()
它时将它们提供给您。
导入的模式可以在不同的命名空间中声明事物,如果您希望XmlSerializer
在不同的命名空间中使用导入的项目生成 XML,您可能需要稍微修改生成的 CodeDOM。
但这是可能的。
祝你好运!
它是一种 [昂贵的] 商业产品,我不能以某种方式保证它,但另一种可能性是http://www.liquid-technologies.com/。他们的“xsd-gen”工具支持多种语言,例如 Java/C#/Silverlight 甚至 C++!如果您需要一致地支持两种语言,则值得一看。
注意:他们有社区版,但没有代码生成功能。
不久前我有一个项目,涉及将 DTD 文档转换为 XSD 文档,然后转换为 .Net 类。XSD.exe 变成了无用代码,因为有许多 XSD 文档引用了一个通用的基本 XSD。我最终编写了自己的 XSD 到 .Net 生成器,使用反射的组合来操纵 system.xml 的内部,并通过逆向工程 xsd.exe。我花了大约 2 周的时间来破解一个可行的生成器。
您是否尝试过LINQ to XSD?项目名称并没有真正描述它的目标,所以我应该说它是 xsd.exe 的有用替代品。