2009-04-30 14 views
5

Me gustaría saber el mejor método para resolver este problema: Me gustaría crear una plantilla en blanco xml a partir de un esquema xml. Todos los elementos y atributos necesarios se crearían y sus valores serían todas cadenas vacías.Creando un archivo xml de xsd en .NET

El siguiente paso es cómo determinar qué nodos hijo xml podría tener un nodo determinado. p.ej. Yo seleccionaría un nodo tiene tiene minOccurs = "0", maxOccurs = "ilimitado" para uno de sus hijos. Sería capaz de determinar todo sobre ese niño, sus atributos, su nombre, su tipo de valor, etc.

Para dar más contexto a la situación, estoy trabajando en una herramienta que permite a los usuarios editar archivos xml en un configuración más fácil de usar. Por ejemplo, podrían agregar una nueva cuenta al nodo 'account db' y verían que el único nodo disponible es un nodo de cuenta. Luego, cuando intenten agregar hijos al nodo de la cuenta, las opciones serían: nodo de nombre (requerido), nodo de contraseña (requerido), nodo de configuración (opcional), etc. ¿Cómo determino de manera programática a qué niños tiene acceso el nodo de cuenta? y cuáles son los atributos y configuraciones de esos niños?

Esto está en C# 2.0 con .NET 2.0.

En resumen, ¿qué clases uso para leer un esquema y analizarlo para obtener información útil para crear un xml? En mi ingenuidad, tenía la esperanza de que, como xsd era xml en sí mismo, habría algún tipo de modelo de DOM que podría atravesar.

Me gustaría que esta se limite a la mi programa por lo que no uso de herramientas externas tales como OxygenXml, VS, xsd.exe, etc.

+1

posible duplicado de [¿Hay una clase para generar un documento XML de muestra a partir del esquema XSD en .NET] (http://stackoverflow.com/questions/41674/is-there-a-class-to-generate-a -sample-xml-document-from-xsd-schema-in-net) –

Respuesta

1

Parece que lo que quiere hacer es replicar la funcionalidad detrás de XML intellisense en la mayoría de los buenos editores XML. es decir, lea un esquema xml y determine qué elementos y atributos pueden aparecer a continuación.

Hemos hecho algo muy similar en un proyecto en el que trabajamos hace algún tiempo. Para producir algo que funciona la mayor parte del tiempo es mucho trabajo, para producir algo que funciona todo el tiempo ¡es un montón de trabajo!

Básicamente necesita cargar el XSD (los objetos XmlSchema en .net le permiten hacer esto). Pero el modelo de objetos SOM que exponen es muy básico, por lo que debe trabajar mucho para interpretarlo. Si ignora conceptos como grupos de sustitución, complexType extension, camaleon schemas y namesapces, debería poder navegar el SOM con bastante facilidad.

A continuación, debe averiguar dónde se encuentra en el documento XML en relación con su esquema. Una vez que sepa que estaba en el SOM, puede comenzar a calcular las opciones disponibles.

Para hacer esto correctamente es de 1,000 'de líneas de código y de 4 a 12 semanas hombre de trabajo. ¿Podrás obtener algo básico juntos en unas pocas semanas?

+0

Sí, eso es lo que estoy descubriendo cuando comencé a trabajar en esto. Crear una biblioteca para esto tomaría muchas horas. Me resigné a atravesar el objeto XmlSchema y seleccionar y extraer la información que necesitaba en este momento. – ipwnponies

0

puede utilizar una herramienta de terceros tales como XMLSPY (link). se convertirá en un xml ficticio de xsd o viceversa.

Una muy rotonda (pero gratis) manera que podría hacer con las herramientas de .NET que existen en su máquina sería utilizar xsd.exe (link) para generar los objetos de entidad que su esquema define utilizando la siguiente:

xsd /classes /language:CS XSDSchemaFile.xsd 

Luego, cuando tenga los objetos, cárguelos en un proyecto y serialícelos. Puede rellenar propiedades y tal si desea agregar algunos datos ficticios.

+0

Lo siento por no señalar esto, quiero que esto se haga únicamente dentro de mi programa. La información más importante que quería era un método o clase que me permitiera analizar el esquema de cualquier información que necesitaba. – ipwnponies

1

He estado sangrando los ojos con los documentos de MSDN y creo que he recogido un olor. Cargue un esquema usando XmlSchema.Read y compílelo. La propiedad Elementos contendrá una colección de elementos de "nivel superior". Tendrá que codificar el nombre calificado del elemento raíz o algo así. Entonces eso es todo. Todavía no he encontrado cómo encontrar los 'contenidos' bajo un elemento de esquema dado.

Editar: He encontrado algunos caminos más por recorrer, pero todavía no es muy claro. XmlSchemaElements tiene una propiedad de tipo de esquema. Esto es simple o complejo. Los tipos complejos en el esquema xml pueden tener atributos, secuencias, grupos, etc. Las secuencias tienen una propiedad llamada partícula que puede ser un elemento. Y el ciclo se repite. Pero creo que la parte más difícil de la implementación sería asegurarse de cubrir todos los casos posibles (tipo simple, tipo complejo con atributo, tipo complejo con atributo y elementos, extensiones, todo el grupo).

Editar: use la propiedad Element del objeto XmlSchema para obtener un XmlSchemaElement. Utilice la propiedad SchemaType de XmlSchemaElement para obtener un tipo simple o complejo. Utilice la propiedad Atributo de XmlSchemaComplexType para obtener atributos o ContentModel para obtener 'contenido simple'/'contenido complejo' o Partícula para obtener 'secuencia'/'elección'/'todo'.Básicamente, un montón de propiedades de bajada y comprobación de tipos y objetos de fundición a la izquierda y derecha y la comprobación de todas las disposiciones posibles de los objetos xsd. Para crear una biblioteca sería largo y engorroso y propenso a errores. Y esto es con esquemas xml, con dtds que ni siquiera quiero comenzar a pensar. Guau, los esquemas xml son necesarios, pero ¿por qué tienen que ser tan malvados?