Создание вспомогательных классов C # с помощью XSD.exe: сбой при обработке импортированных схем

2

Я хотел бы создать вспомогательные файлы С# из KML2.2 xml schema с помощью инструмента XSD.exe(из VS2008 SDK). С KML2.1 инструмент работал просто отлично. Тем не менее, схема KML2.2 содержит теги импорта, указывающие на другие схемы, вызывающие увлечение XSD.exe.

Это сообщение об ошибке, которое я получаю:

C:\Program Files\Microsoft Visual Studio 2008 SDK\VisualStudioIntegration\Sample
s\Sdm> xsd.exe d:\temp\kml22.xsd /c /l:CS /n:Google.Kml22 /o:D:\temp\

Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.

Schema validation warning: The 'http://www.w3.org/2005/Atom:author' element is
 not declared. Line 311, position 12.
Schema validation warning: The 'http://www.w3.org/2005/Atom:link' element is not
 declared. Line 312, position 12.
Schema validation warning: The 'urn:oasis:names:tc:ciq:xsdschema:xAL:2.0:Address
Details' element is not declared. Line 314, position 12.

Warning: Schema could not be validated. Class generation may fail or may produce
 incorrect results.

Error: Error generating classes for schema 'd:\temp\kml22'.
  - The element 'http://www.w3.org/2005/Atom:author' is missing.

Есть ли у вас предложения, как я могу сгенерировать свои вспомогательные файлы С#?

Теги:
import
xsd
xsd.exe

2 ответа

5
Лучший ответ

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

0

Я написал быстрый LinqPad script, чтобы сделать XSD.EXE делать мои ставки. Скопируйте/вставьте это в LinqPad, измените третью строку, чтобы указать на ваш XSD, нажмите F5 и TADA!

void Main()
{
    var file = @"C:\.... some.xsd";
    Do(file);
    files.Dump();

    ("xsd.exe \"" + string.Join("\" \"", files) + "\" /classes").Dump();
}

private void Do(string file)
{
    file = file.ToLower();

    var dir = Path.GetDirectoryName(file);
    var contents = File.ReadAllText(file);
    var regex = @"schemaLocation=""(.*?)""";

    if (files.Contains(file))
    {
        return;
    }

    files.Add(file);

    var toProcess = Regex.Matches(contents, regex).OfType<Match>().Select (m => m.Groups[1].Value).Select (m => 
    {
        if (Path.IsPathRooted(m))
        {
            return m;
        }
        else
        {
            return Path.GetFullPath(Path.Combine(dir, m));
        }
    }).Select (m => m.ToLower()).Where (m => !files.Contains(m)).ToList();

    foreach (var nested in toProcess)
    {
        Do(nested);
    }
}
private List<string> files = new List<string>();

Подробнее об этом читайте в http://www.alexdresko.com/2015/10/08/xsd-exe-and-imports-a-solution/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню