gpt4 book ai didi

.net-3.5 - 从已知 XSD 生成 .Net 对象

转载 作者:行者123 更新时间:2023-12-01 11:10:37 24 4
gpt4 key购买 nike

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

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

此外,我正在寻找: - 更多工具 - 这些工具之间的比较 - xsd 对象使用 .net 3.5谢谢。

最佳答案

您没有理由不能使用 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公平一点。

但这是可能的。

祝你好运!

关于.net-3.5 - 从已知 XSD 生成 .Net 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/312551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com