Программно использовать функцию инструмента XSD.exe (генерировать схему из класса) через классы .NET Framework? - PullRequest
7 голосов
/ 11 ноября 2010

Я хочу сгенерировать XML-схему на основе класса, как вы можете сделать с помощью инструмента Xsd.exe .

например. xsd.exe /type: typename /outputdir:c:\ assmeblyname.

Есть ли способ сделать это , используя классы в .NET Framework вместо использования отдельного инструмента?

Я уверен, что я видел информацию о ссылках на задачи или аналогичных - то есть что-то программных - которые можно использовать вместо некоторых из этих автономных утилит, или что некоторые автономные утилиты получают свои функции через FCL или Microsoft API ,

Ответы [ 2 ]

1 голос
/ 20 января 2011

сделать это:

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();
        }

}
1 голос
/ 11 ноября 2010

Нашел это, похоже, должно сработать ...

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();
        }
    }
...