Создание объектов .Net из известного XSD

У меня есть несколько XSD, которые определяют иерархию моих объектов. например math.xsd, base.xsd, а math.xsd зависит от base.xsd. Мне нужно сгенерировать классы из этих xsd-ов.

Я уже читал об этих двух инструментах: CodeXS и XSD.exe. проблема с xsd.exe в том, что мне не удалось сгенерировать классы из двух xsd-ов, которые зависят друг от друга. есть ли кто-нибудь, кто знает правильные параметры использования xsd.exe в таком случае?

кроме того, я ищу: - дополнительные инструменты - сравнение этих инструментов - xsd для объекта с использованием .net 3.5 Спасибо.


person rabashani    schedule 23.11.2008    source источник
comment
Как реализована зависимость между math.xsd и base.xsd? Это правильный XML?   -  person PVitt    schedule 26.08.2009


Ответы (5)


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

Общая идея состоит в том, что вы загружаете свой XSD-файл в объект XmlSchema, а затем используете внутренние классы XmlCodeExporter и XmlSchemaImporter для заполнения пространства имен CodeDOM.

После того, как вы это сделаете, вы можете внести любые изменения в AST CodeDOM, а затем записать их на диск.

Eg.

  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 на преобразователь, который вы пишете, который найдет импортированные схемы и предоставит их XmlSchemaSet, когда вы вызовете для него Compile().

Импортированные схемы могут объявлять объекты в другом пространстве имен, и если вы хотите, чтобы ваш XmlSerializer генерировал XML с импортированными элементами в другом пространстве имен, вам, возможно, придется немного взломать сгенерированный CodeDOM.

Но это возможно.

Удачи!

person Leon Breedt    schedule 22.08.2009


это [дорогой] коммерческий продукт, и я не могу поручиться за него так или иначе, но другая возможность - http://www.liquid-technologies.com/. Их инструмент xsd-gen поддерживает множество языков, таких как Java / C # / Silverlight и даже C ++! Стоит взглянуть, если вам нужно постоянно поддерживать два языка.

Примечание: у них есть версия для сообщества, но в ней нет возможностей генерации кода.

person Simon_Weaver    schedule 15.12.2009

Вы пробовали LINQ to XSD? Название проекта не совсем описывает его цель, поэтому я должен сказать, что это полезная замена xsd.exe.

person Artem Koshelev    schedule 19.08.2009

Некоторое время назад у меня был проект, который включал преобразование документов DTD в документы XSD, а затем в классы .Net. XSD.exe оказался полезным кодом, поскольку существовал ряд документов XSD, которые относились к общему базовому XSD. Я закончил тем, что написал свой собственный генератор XSD в .Net, используя комбинацию отражения для управления внутренними компонентами system.xml и путем обратного проектирования xsd.exe. На создание работоспособного генератора у меня ушло около 2 недель.

person Joe Caffeine    schedule 20.08.2009