2012-05-11 19 views
7

Tengo un archivo xml (que he creado en C# usando XmlDocument) y ahora tengo que crear el archivo xsd que también se corresponde programáticamente en C# ... ¿cómo puedo hacer esto? ¿Puedo usar las mismas clases para crear archivos xml? o ¿hay alguna otra clase (relacionada con xsd) que deba usar?¿Cómo crear un archivo XSD programáticamente en C#?

+2

Debe tenerse en cuenta que un documento XML no tiene los metadatos necesarios para construir el XSD que describe el documento. ¿Su documento XML es un XSD, o un documento que desea describir/definir con un XSD? –

+0

Es un documento XML que desea describir utilizando el archivo XSD – Shadi

Respuesta

2

XSD es simplemente otro archivo de tipo XML. lo que sea que esté utilizando para crear su archivo XML también será útil para crear el archivo XSD; solo necesita saber qué etiquetas/atributos desea colocar en el archivo ...

+0

XSD significa * ahem * Definición de esquema XML. Qué significa eso? Eso significa que está escrito en XML válido. Lo que significa que cualquier escritor XML debería ser capaz de crear uno sin problemas. –

+0

Gracias por sus respuestas ... eso es exactamente lo que hice, pero el problema es que los prefijos de los elementos xsd no se han generado, aunque lo escribí en el método XmlDocument CreateElement – Shadi

+1

@shady si tiene un código que usted lo he intentado y no funciona correctamente, podría ayudar el publicar las partes relevantes para que podamos ayudarlo – psubsee2003

4

Si solo desea producir un archivo XSD a partir de un archivo XML, puede usar el XSD.EXE de Microsoft, que se incluye con Visual Studio .

Para usarlo, abra un símbolo del sistema de Visual Studio. Luego ingrese xsd file.xml para producir un esquema para ese archivo XML.

También puede usar esa herramienta para generar clases para su entrada XML, simplemente pase el parámetro /classes.

4

Mientras que un archivo de esquema XML es un archivo XML, tiene ciertas cosas que pueden hacer que sea engorroso hacerlo "a mano"; uno podría decir por qué escribir XML usando DOM API en lugar de usar clases C# generadas por XSD.exe o XSD2Code.exe? O para presionarlo un poco ... algo similar a alguien que dice que las declaraciones C# eventualmente se convierten en ensamblado IL; ¿por qué no escribir IL en su lugar?

Otra alternativa es la API del modelo de objetos de esquema; en .NET, es el espacio de nombre System.Xml.Schema.

Eche un vistazo a code example found here on MSDN. Te dará una idea para otro enfoque. Proporciona una API amigable para programadores para generar XSD, en lugar de tratar con el XML real.

1

Solución: Originalmente publiqué una respuesta, pero Stack Overflow en lugar de editar mi respuesta, así que aquí está la edición. La herramienta original que sugerí va a la inversa. Luego investigué y alguien me recomendó una herramienta llamada MyGenerations o algo así. Eso requería una instalación, plantilla descargada y montones de trabajos, por lo que era demasiado complicado. Luego investigué un poco más y encontré una solución bastante ingeniosa en CodePage, pero esa solución, que funciona, porque la probé, requiere algunas modificaciones. El código se llama XmlToXsd con la URL:

http://www.codeproject.com/Articles/133570/XmlToXsd-A-Better-Schema-Generator.

La sección Programas tiene dos errores. Primero guarda el XSD en la raíz del ejecutable. No se preocupe, el ejecutor simplemente llama a un método ubicado en un archivo CS. Simplemente incluya ese archivo CS en su proyecto y llame con la línea indicada, solo tiene que cambiar la ruta a la misma carpeta que el XML. Además, el autor utiliza un espacio de nombre de destino de una URL no deseada. DevExpress lanza una queja sobre la URL inexistente. Con un poco de esfuerzo, reemplacé la URL objetivo con nulo. En el archivo adjunto CS tuve que hacer algunos cambios. Otros con más comprensión de la que yo puedo modificar a su alcance. Me limito a ayudar a otros diciéndoles lo que hice, por lo que no hay estática de vuelta.

Cambio 1: antes "target = XNamespace.Get (targetNamespace);" agregue una sentencia if solo cargando si no es nulo para el espacio de nombres de destino.

Cambio 2: He añadido otra declaración if para la devolución. El retorno nulo, una copia de la devolución original se modifica de la siguiente manera:

2.1: Nuke el ítem de atributo espacio de destino. 2.2: Después de la llamada de reemplazo, agregue otra llamada de reemplazo de ".Reemplazar ("xmlns = \" null \ "", null)) ". 2.3: antes de la devolución, requiere agregar llaves, establecer target =" nulo ".

El archivo resultante ahora parece totalmente válido y creado programáticamente.

Sí, se puede utilizar XSD.exe pero de forma manual, pero necesitaba una manera programática de la conversación

post original:. que tenía la misma pregunta, no necesariamente programáticamente la utilidad XSD hace hacer el trabajo. El problema es que Microsoft no distribuye xsd.exe con Visual Studio 2012 Professional. Busqué en mi disco duro y encontré la utilidad con el SDK de Microsoft, la ruta en mi disco "C: \ Program Fi les (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64 \ xsd.exe ".

Tenía que ir a la carpeta donde está el archivo XML y ejecutar la utilidad XSD desde un cuadro de comandos (no en Visual Studio) y terminar con el archivo XSD.

Una forma de hacer esta tarea programáticamente es llamar a XSD desde el código, pero eso significaría distribuir XSD.

Encontré este ensamblaje, pero nunca lo usé para hacer el trabajo. Salida: http://xsd2code.codeplex.com/

-1

Prueba esto:

string xmlFilePath = @"myxmlfile.xml"; 
string xsdOutputPath = @"myxmlfile.xsd"; 

DataSet ds = new DataSet(); 

System.IO.FileStream fsReadXml = new System.IO.FileStream(xmlFilePath, System.IO.FileMode.Open); 
ds.ReadXml(fsReadXml); 

ds.WriteXmlSchema(xsdOutputPath); 

Si desde XDocument:

DataSet ds = new DataSet(); 
ds.ReadXml(YourXDocument.CreateReader()); 
ds.WriteXmlSchema(xsdOutputPath); 
Cuestiones relacionadas