Преобразование XSD в класс .cs - PullRequest
0 голосов
/ 14 сентября 2018

Я знаю, что это может показаться дублирующим вопросом, но я сильно сомневаюсь в этом. В настоящее время я делаю приложение Windows Form, в котором пользователь может выбрать файл XSD, используя OpenFileDialog

Как только XSD загружен / выбран, я хочу, чтобы он создал файл .cs из него, используя инструмент XSD разработчика по умолчанию.

Но по какой-то причине он просто открывает выбранный XSD-файл в блокноте (?)

Я попытался прокомментировать код, чтобы придать ему смысл.

 //Filter only .xsd files
            ofd.Filter = "XSD|*.xsd";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                //Read file name
                string File = ofd.FileName;
                string z = ofd.InitialDirectory;
                //Start making commands for in the CMD 
                //Change directory to the folder where the Dev Command prompt is located
                string changeDirectory = @"cd C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\";
                //Open the Dev CMD
                string bat = "VsDevCmd";
                //Change folder to our test folder 
                string cd = @"cd C:\Users\Pierre\Desktop\testxsd";
                //execute xsd /c *selected file* /c is used to create the .cs file.
                string command = @"xsd /c " + File;
                //Combine the commands into 1 line.
                string x = cd + "&" + command;
                string xyz = changeDirectory + "&" + bat + "&" + x;
                //print the outcome -> When I copy paste this into CMD the .cs file is generated

                Console.WriteLine(xyz);
                ProcessStartInfo oInfo = new ProcessStartInfo(Environment.ExpandEnvironmentVariables(@"C:\WINDOWS\system32\cmd.exe"), xyz);
                oInfo.UseShellExecute = false;
                oInfo.ErrorDialog = false;
                oInfo.CreateNoWindow = true;
                oInfo.RedirectStandardOutput = true;
                try
                {
                    Process p = System.Diagnostics.Process.Start(oInfo);
                    System.IO.StreamReader oReader2 = p.StandardOutput;
                    string sRes = oReader2.ReadToEnd();
                    oReader2.Close();
                    // sRes now contains the output from xsd.exe     
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

Итак, как вы можете видеть в комментариях, когда я копирую, вставляю console.writeline (xyz) в CMD, он был правильно выполнен, и файл .cs генерируется, как и должно быть.

Однако, когда я просто запускаю этот код, он открывает выбранный xsd в блокноте. Буквально понятия не имею, что может быть не так

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я думаю, вы должны использовать для этого пакет XmlSchemaClassGenerator ( Nuget ). Таким образом, вам не придется делать весь процесс манипулирования собой.

Пример из GitHub readme:

var generator = new Generator
{
    OutputFolder = outputFolder,
    Log = s => Console.Out.WriteLine(s),
    GenerateNullables = true,
    NamespaceProvider = new Dictionary<NamespaceKey, string> 
        { 
            { new NamespaceKey("http://wadl.dev.java.net/2009/02"), "Wadl" } 
        }
        .ToNamespaceProvider(new GeneratorConfiguration { NamespacePrefix = "Wadl" }.NamespaceProvider.GenerateNamespace)
};

generator.Generate(files);
0 голосов
/ 14 сентября 2018

Вы как бы выбираете очень длинный панорамный маршрут, когда на самом деле очень быстрый ... Как сказано в комментариях @PatrickHofman, используйте xsd напрямую ...

Для этого откройтев командной строке Visual Studio и введите where xsd, чтобы найти точный путь к исполняемому файлу xsd.

Затем запустите процесс, используя xsd из найденного пути и различных опций, т.е./c и filename.

using System.Diagnostics;
...
FileInfo fi = new FileInfo(ofd.FileName);
Process process = new Process();
process.StartInfo.FileName = xsdPath;
process.StartInfo.Arguments = "/c " + fi.FullName;
process.StartInfo.WorkingDirectory = fi.DirectoryName;
process.Start();
//wait for exit if needed...
process.WaitForExit();

Если по какой-то причине это не работает, запишите выходные данные команды, выполнив это до process.Start():

process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += 
(sender, args) => Console.WriteLine("received output: {0}", args.Data);
process.BeginOutputReadLine();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...