【问题标题】:Programmatically use XSD.exe tool feature (generate schema from class) through .NET Framework classes?通过 .NET Framework 类以编程方式使用 XSD.exe 工具功能(从类生成架构)?
【发布时间】:2010-11-10 23:08:37
【问题描述】:

我想根据一个类生成一个 XML Schema,就像你可以做的那样 使用Xsd.exe tool

例如xsd.exe /type: typename /outputdir:c:\ assmeblyname

有没有办法通过使用 .NET Framework 中的类而不是使用独立工具来做到这一点?

我确定我已经看到有关任务引用或类似的信息(即程序化的东西),这些信息可以用来代替其中一些独立实用程序,或者某些独立实用程序通过 FCL 或 Microsoft API 获得其功能.

【问题讨论】:

  • 我不知道(作为具有GenerateXsd() 方法的一次性类)。但是您可以使用 System.Reflection 和 System.Xml 中的许多类重新创建它。
  • 嗯……谢谢 JesseC。有人知道互联网上的一些这种预先包装好的肘部润滑脂吗?
  • 不是你要找的,但你可以包装工具。如果是 .NET 工具,也可以引用 exe,并选择代码。
  • Google 显示:daniweb.com/forums/thread80993.html。可能有用吗?

标签: .net xsd.exe fcl


【解决方案1】:

发现这个看起来应该可以解决问题...

public static string GetSchema<T>()
    {
        XmlAttributeOverrides xao = new XmlAttributeOverrides();
        AttachXmlAttributes(xao, typeof(T));

        XmlReflectionImporter importer = new XmlReflectionImporter(xao);
        XmlSchemas schemas = new XmlSchemas();
        XmlSchemaExporter exporter = new XmlSchemaExporter(schemas);
        XmlTypeMapping map = importer.ImportTypeMapping(typeof(T));
        exporter.ExportTypeMapping(map);

        using (MemoryStream ms = new MemoryStream())
        {
            schemas[0].Write(ms);
            ms.Position = 0;
            return new StreamReader(ms).ReadToEnd();
        }
    }

【讨论】:

【解决方案2】:

这样做:

public string GetFullSchema() {

        string @namespace = "yourNamespace";

        var q = from t in Assembly.GetExecutingAssembly().GetTypes()
        where t.IsClass && t.Namespace ==  @namespace
        select t;

        XmlReflectionImporter importer = new XmlReflectionImporter(@namespace);

        XmlSchemas schemas = new XmlSchemas();
        XmlSchemaExporter exporter = new XmlSchemaExporter(schemas);


        foreach (var x in q)
        {
                var map = importer.ImportTypeMapping(x);
                exporter.ExportTypeMapping(map);
        }

        using (MemoryStream ms = new MemoryStream())
        {
           schemas[0].Write(ms);
           ms.Position = 0;
           return new StreamReader(ms).ReadToEnd();
        }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 2021-07-26
    • 1970-01-01
    • 2011-10-27
    • 2013-10-01
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多