2012-05-11 12 views
7

Ho un file xml (che ho creato in C# usando XmlDocument) e ora devo creare il file xsd che corrisponde anche programmaticamente in C# ... come posso fare ?? posso usare le stesse classi per creare file xml? o ci sono altre classi (correlate a xsd) che dovrei usare ??Come creare file XSD a livello di codice in C#?

+2

Si deve ricordare che un documento XML non ha i metadati necessari per costruire il XSD che descrive la documento. Il tuo documento XML è un XSD o un documento che desideri descrivere/definire usando un XSD? –

+0

È un documento XML che si desidera descrivere usando il file XSD – Shadi

risposta

2

XSD è solo un altro file di tipo XML. qualunque cosa tu stia usando per creare il tuo file XML sarà anche utile per creare il file XSD; è sufficiente sapere quali tag/attributi si desidera inserire nel file ...

+0

XSD sta per * ahem * XML Schema Definition. Cosa significa? Ciò significa che è scritto in XML valido. Ciò significa che qualsiasi writer XML dovrebbe essere in grado di crearne uno senza problemi. –

+0

Grazie per le tue risposte ... questo è esattamente quello che ho fatto, ma il problema è che i prefissi degli elementi xsd non sono stati generati anche se l'ho scritto nel metodo CreateElement XmlDocument – Shadi

+1

@shady se hai il codice che hanno provato e non funziona correttamente, potrebbe aiutare a pubblicare le parti rilevanti in modo da poterti aiutare – psubsee2003

4

Se si desidera generare un file XSD da un file XML, è possibile utilizzare Microsoft XSD.EXE, incluso in Visual Studio. .

Per utilizzarlo, aprire un prompt dei comandi di Visual Studio. Quindi immettere xsd file.xml per produrre uno schema per quel file XML.

È anche possibile utilizzare lo strumento per generare classi per l'input XML, è sufficiente passare il parametro /classes.

4

Mentre un file XML Schema è un file XML, ha alcune cose che potrebbero rendere complicato farlo "a mano"; si potrebbe dire perché scrivere XML usando l'API DOM invece di usare le classi C# generate da XSD.exe o XSD2Code.exe? O per spingerlo un po '... in qualche modo simile a qualcuno che dice che le affermazioni di C# alla fine si trasformano in assemblaggi di IL; perché non scrivere invece IL?

Un'altra alternativa è fornita dall'API del modello a oggetti schema; in .NET, è lo spazio dei nomi System.Xml.Schema.

Dai uno sguardo allo code example found here on MSDN. Ti darà un'idea per un altro approccio. Fornisce un'API adatta ai programmatori per generare XSD, invece di gestire l'effettivo XML.

1

Soluzione: Originariamente ho inviato una risposta, ma Stack Overflow, invece, modifica la mia risposta, quindi ecco la modifica. Lo strumento originale che ho suggerito va dall'altra parte. Ho quindi fatto delle ricerche e qualcuno mi ha consigliato uno strumento chiamato MyGenerations o qualcosa del genere. Ciò ha richiesto un'installazione, un modello scaricato e una gran quantità di lavoro, in modo troppo complicato. Ho quindi fatto qualche ricerca in più e ho trovato una soluzione piuttosto ingegnosa su CodePage, ma quella soluzione, che funziona, perché l'ho testata, richiede alcune modifiche. Il codice si chiama XmlToXsd con l'URL:

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

La sezione Programmi presenta due errori. Per prima cosa salva l'XSD nella radice dell'eseguibile. Non preoccuparti, l'exe chiama semplicemente un metodo che si trova in un unico file CS. Semplicemente includi quel file CS nel tuo progetto e chiama con la linea data, devi solo cambiare il percorso della stessa cartella dell'XML. Inoltre, l'autore utilizza uno spazio targetname di un URL indesiderato. DevExpress lancia un reclamo sull'URL inesistente. Con qualche sforzo, ho sostituito l'URL di destinazione con null. Nel file CS allegato ho dovuto apportare alcune modifiche. Altri con più comprensione di me possono modificare l'estensione dei suoi cuori. Semplicemente aiuto gli altri dicendo loro quello che ho fatto, quindi non sono tornato indietro.

Modifica 1: prima di "target = XNamespace.Get (targetNamespace);" aggiungi un'istruzione if solo caricando se non è nulla per lo spazio dei nomi di destinazione.

Modifica 2: ho aggiunto un'altra istruzione if per il reso. Il ritorno nullo, una copia del ritorno originale modifica come segue:

2.1: Nuke l'elemento attributo targetnamespace. 2.2: Dopo la chiamata di sostituzione, aggiungere un'altra chiamata di sostituzione di ".Sostituisci ("xmlns = \" null \ "", null)) ". 2.3: Prima del ritorno, richiede l'aggiunta di parentesi graffe, imposta target =" null "

Il file risultante ora appare totalmente valido e creato in modo programmatico.

Sì, si può usare XSD.exe ma manualmente, ma avevo bisogno di un modo programmatico della conversazione

originale del messaggio:. ho avuto la stessa domanda, non necessariamente programatically l'utilità XSD fa fare il lavoro. Il problema è che Microsoft non distribuisce xsd.exe con Visual Studio 2012 Professional. Ho cercato il mio disco rigido e ho trovato l'utilità con l'SDK di Microsoft, percorso sul mio disco "C: \ Program Fi les (x86) \ Microsoft SDK \ Windows \ v7.0A \ Bin \ x64 \ xsd.exe ".

Ho dovuto andare alla cartella in cui si trova il file XML ed eseguire l'utilità XSD da una casella di comando (non in Visual Studio) e terminare con il file XSD.

Un modo per eseguire questa operazione in modo programmatico è chiamare XSD dal codice, ma ciò significherebbe distribuire XSD.

Ho trovato questo assemblaggio, ma non l'ho mai usato per eseguire il lavoro. Partenza: http://xsd2code.codeplex.com/

-1

Prova questo:

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); 

Se da XDocument:

DataSet ds = new DataSet(); 
ds.ReadXml(YourXDocument.CreateReader()); 
ds.WriteXmlSchema(xsdOutputPath); 
Problemi correlati