.net 3.5 - studio - Genera objetos.Net de XSD conocido
xsd to class visual studio (5)
Tengo algunos XSD-s que definen la jerarquía de mis objetos. por ejemplo, math.xsd, base.xsd mientras que math.xsd depende de base.xsd. Necesito generar clases a partir de esos xsd-s.
Ya leí sobre esas dos herramientas: la herramienta CodeXS y XSD.exe . el problema con xsd.exe es que no tuve éxito al generar clases de dos xsd-s que dependen uno del otro. ¿Hay alguien que conozca los parámetros correctos para usar xsd.exe en este caso?
además, estoy buscando: - más herramientas - comparación entre esas herramientas - xsd para objetar usando .net 3.5 Gracias.
¿Has probado el LINQ to XSD ? El nombre del proyecto realmente no describe su objetivo, por lo que debería decir que es un reemplazo útil para xsd.exe.
Hace un tiempo tuve un proyecto que involucraba convertir documentos DTD en documentos XSD y luego en clases .Net. XSD.exe resultó código de uselness ya que había una serie de documentos XSD que se referían a una base común XSD. Terminé escribiendo mi propio generador XSD en .Net usando una combinación de reflexión para manipular las partes internas de system.xml y mediante ingeniería inversa xsd.exe. Me tomó alrededor de 2 semanas para hackear juntos un generador viable.
No hay ninguna razón por la que no pueda usar el mismo enfoque que utiliza xsd.exe
, pero luego ejecute su propio código contra el modelo CodeDOM generado para realizar las modificaciones que necesita antes de escribir los archivos .cs en el disco.
La idea general es que cargue su archivo XSD en un objeto XmlSchema
, luego use las XmlCodeExporter
internas XmlCodeExporter
y XmlSchemaImporter
para rellenar un espacio de nombres CodeDOM.
Después de que hayas hecho eso, podrás hacer los ajustes que necesites contra CodeDOM AST y luego escribirlos en el disco.
P.ej.
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())
Si los esquemas hacen referencia a otros esquemas, deberá usar XmlSchemaSet
y establecer la propiedad XmlResolver
en un resolver que escriba, que encontrará los esquemas importados y los proporcionará a XmlSchemaSet
cuando llame a Compile()
en él.
Es posible que los esquemas importados declaren cosas en un espacio de nombres diferente, y si desea que su XmlSerializer
genere XML con los elementos importados en un espacio de nombre diferente, es posible que tenga que piratear el CodeDOM generado un poco.
Pero es posible.
¡Buena suerte!
es un producto comercial [caro], y no puedo responder de una manera u otra, pero otra posibilidad es http://www.liquid-technologies.com/ . Su herramienta ''xsd-gen'' es compatible con muchos lenguajes, como Java / C # / Silverlight e incluso C ++. Vale la pena echarle un vistazo si necesita admitir dos idiomas consistentemente.
Nota: tienen una edición de comunidad pero no tiene capacidades de código gen.