Генерация .Net объектов из известного XSD - PullRequest
3 голосов
/ 23 ноября 2008

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

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

кроме того, я ищу: - больше инструментов - сравнение между этими инструментами XSD для объекта с использованием .net 3,5 Спасибо.

Ответы [ 5 ]

3 голосов
/ 22 августа 2009

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

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

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

Например.

  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.

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

Удачи!

1 голос
/ 15 декабря 2009

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

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

0 голосов
/ 20 августа 2009

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

0 голосов
/ 20 августа 2009

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

...