我有一些定义我的对象层次结构的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 感谢对象。
我有一些定义我的对象层次结构的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 感谢对象。
您是否尝试过LINQ to XSD?项目名称并没有真正描述它的目标,所以我应该告诉它它可以替代xsd.exe。
我曾经有一个项目,涉及将DTD文档转换为XSD文档,然后转换为.Net类。 XSD.exe变成了uselness代码,因为有一些XSD文档引用了一个通用的基础XSD。我最终使用反射的组合来编写我自己的XSD到.Net生成器来操纵system.xml的内部结构,并通过逆向工程xsd.exe。我花了大约2周时间才将一台可行的发电机组合在一起。
没有理由不能使用相同方法xsd.exe
的用法,但是在将.cs文件写入磁盘之前,针对生成的CodeDOM模型运行自己的代码以进行所需的修改。
总的想法是,你加载你的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())
如果你的架构引用其他模式,你必须在调用Compile()
使用XmlSchemaSet
和XmlResolver
属性设置为你写一个解析器,它会发现导入的模式,并提供他们的XmlSchemaSet
在上面。
导入的模式可能在不同的命名空间中声明事物,并且如果您希望XmlSerializer
在导入的项目位于不同的命名空间中生成XML,则可能必须将生成的CodeDOM破解为合理位。
但它是可能的。
祝你好运!
它的[昂贵]商业产品,我不能担保一种或另一种,但另一种可能性是http://www.liquid-technologies.com/。他们的'xsd-gen'工具支持许多语言,例如Java/C#/ Silverlight甚至C++!值得一看,如果你需要一致支持两种语言。
注意:他们有一个社区版,但没有代码生成功能。
math.xsd和base.xsd之间的依赖关系如何实现?它是有效的XML吗? – PVitt 2009-08-26 19:12:21