Pregunta

Me gustaría saber cuál es el mejor método para resolver este problema: Me gustaría crear un xml de plantilla en blanco a partir de un esquema xml. Se crearían todos los elementos y atributos necesarios y sus valores serían todas las cadenas vacías.

El siguiente paso es cómo determinar qué nodos XML secundarios podría tener un determinado nodo. p.ej. Yo seleccionaría un nodo que 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 una configuración más fácil de usar. Por ejemplo, podrían agregar una nueva cuenta al nodo 'db cuenta' y verían que el único nodo disponible es un nodo de cuenta. A continuación, cuando intenten agregar hijos al nodo de la cuenta, las opciones serán nombre del nodo (requerido), nodo de la contraseña (requerido), nodo de configuración (opcional), etc. ¿Cómo puedo determinar qué hijos tiene disponible el nodo de la cuenta? ¿Y cuáles son los atributos y las configuraciones de esos niños?

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

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

Me gustaría que esto se limitara a mi programa, por lo que no uso herramientas externas como OxygenXml, VS, xsd.exe, etc.

¿Fue útil?

Solución

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

Hemos hecho algo muy similar en un proyecto en el que trabajamos hace un tiempo. Producir algo que funcione la mayor parte del tiempo es mucho trabajo, producir algo que funcione todo el tiempo es un montón de trabajo.

Básicamente, necesitas cargar el XSD (los objetos XmlSchema en .net te permiten hacer esto). Pero el modelo de objetos de SOM que exponen es muy simple, por lo que necesita hacer mucho trabajo para interpretarlo. Si ignora conceptos como los grupos de sustitución, la extensión de tipo complejo, los esquemas de camaleón y los nombres de nombres, debería poder navegar el SOM de manera razonablemente sencilla.

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

Hacer esto correctamente es 1,000 'de líneas de código y 4-12 semanas laborales de trabajo. ¿Podrías obtener algo básico en pocas semanas?

Otros consejos

He estado sangrando mis ojos con los documentos de MSDN y creo que he captado un olor. Cargue un esquema usando XmlSchema. Lea y compile. La propiedad Elementos contendrá una colección de los elementos de 'nivel superior'. Tendrás 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' en un elemento de esquema determinado.

Edit: he encontrado algunos caminos más para ir, pero aún no está 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 difícil en la implementación sería asegurarnos de cubrir todos los casos posibles (tipo simple, tipo complejo con atributo, tipo complejo con atributo y elementos, extensiones, todo el shebang).

Editar: use la propiedad Element del objeto XmlSchema para obtener un XmlSchemaElement. Use 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, una gran cantidad de propiedades que se desplazan hacia abajo y la verificación de tipos y el lanzamiento de objetos a la izquierda y la derecha y la comprobación de todas las posibles disposiciones de los objetos xsd. Crear una biblioteca sería largo, engorroso y propenso a errores. Y esto es con esquemas xml, con dtds que ni siquiera quiero empezar a pensar. Wow, los esquemas XML son necesarios, pero ¿por qué tienen que ser tan malvados?

puede utilizar una herramienta de terceros como XMLSPY ( enlace ). creará un archivo xml ficticio desde xsd o viceversa.

Una forma realmente indirecta (pero gratuita) que podría hacer con las herramientas .NET que existen en su máquina sería usar xsd.exe ( link ) para generar los objetos de entidad que su esquema define usando lo siguiente:

xsd /classes /language:CS XSDSchemaFile.xsd

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top