我有一些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 感谢。
答案 0 :(得分:3)
没有理由不能使用xsd.exe
使用相同的方法,但是在生成的CodeDOM模型上运行自己的代码,以便在将.cs文件写入磁盘之前进行所需的修改。
一般的想法是将XSD文件加载到XmlSchema
对象中,然后使用内部XmlCodeExporter
和XmlSchemaImporter
类来填充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。我花了大约两个星期的时间来破解一个可行的发电机。