2009-04-30 5 views
5

Vorrei conoscere il metodo migliore per risolvere questo problema: Vorrei creare un modello xml vuoto da uno schema xml. Verrebbero creati tutti gli elementi e gli attributi richiesti e i loro valori sarebbero tutte stringhe vuote.Creazione di un file xml da xsd in .NET

Il passaggio successivo è come determinare quali nodi xml secondari potrebbero avere un determinato nodo. per esempio. Vorrei selezionare un nodo ha ha minOccurs = "0", maxOccurs = "illimitato" per uno dei suoi figli. Sarei in grado di determinare tutto su quel bambino, i suoi attributi, il suo nome, il suo tipo di valore, ecc.

Per dare più contesto sulla situazione, sto lavorando a uno strumento che consente agli utenti di modificare i file xml in un impostazione più user friendly. Ad esempio, potrebbero aggiungere un nuovo account al nodo 'account db' e vedrebbero che l'unico nodo disponibile è un nodo account. Successivamente, quando provano ad aggiungere figli al nodo account e le scelte sono nome nodo (obbligatorio), nodo password (obbligatorio), nodo impostazioni (facoltativo), ecc. Come determinare a livello di programma a quali bambini il nodo account è disponibile per e quali sono gli attributi e le impostazioni su quei bambini?

Questo è in C# 2.0 con .NET 2.0.

In sintesi, quali classi devo utilizzare per leggere uno schema e analizzarlo per ottenere informazioni utili per la creazione di un xml? Nella mia ingenuità, speravo che dal momento che xsd fosse xml in sé, ci sarebbe stata una sorta di modello DOM che avrei potuto attraversare.

Vorrei che questo essere limitato al mio programma in modo che nessun uso di strumenti esterni come OxygenXml, VS, xsd.exe, ecc

+1

possibile duplicato di [Esiste una classe per generare un documento XML di esempio dallo schema XSD in .NET] (http://stackoverflow.com/questions/41674/is-there-a-class-to-generate-a -sample-xml-document-from-xsd-schema-in-net) –

risposta

1

Sembra che ciò che si vuole fare sia replicare la funzionalità alla base dell'intelligence XML nella maggior parte degli editor XML validi. cioè leggi uno schema xml e scopri quali elementi e attributi possono venire dopo.

Abbiamo fatto qualcosa di molto simile su un progetto in cui abbiamo lavorato qualche tempo fa. Produrre qualcosa che funziona il più delle volte è molto lavoro, produrre qualcosa che funziona sempre è un sacco di lavoro!

Fondamentalmente è necessario caricare XSD (gli oggetti XmlSchema in .net consentono di farlo). Ma il modello di oggetto SOM che espongono è molto grezzo, quindi è necessario fare un sacco di lavoro per interpretarlo. Se ignori concetti come gruppi di sostituzione, estensione complexType, schemi di chameleon e namesapce, dovresti essere in grado di navigare con facilità nell'SOM.

È quindi necessario capire dove ci si trova nel documento XML in relazione al proprio schema. Una volta saputo che eri nella SOM, puoi quindi iniziare a elaborare le opzioni disponibili.

Per fare ciò correttamente sono necessarie 1000 'di righe di codice e 4-12 settimane di lavoro. Potresti riuscire a ottenere qualcosa di base insieme in poche settimane?

+0

Sì, questo è quello che sto scoprendo quando ho iniziato a lavorare su questo. Creare una biblioteca per questo richiederebbe davvero molte ore. Mi sono dimesso per attraversare l'oggetto XmlSchema e raccogliere e tirare le informazioni di cui avevo bisogno in questo momento. – ipwnponies

0

è possibile utilizzare uno strumento di terze parti come ad esempio XMLSPY (link). farà un xml fittizio da xsd o viceversa.

Un davvero rotonda (ma libero) modo si potrebbe fare con strumenti .NET che esistono sulla macchina sarebbe quella di utilizzare xsd.exe (link) per generare gli oggetti l'entità che lo schema definisce usando la seguente:

xsd /classes /language:CS XSDSchemaFile.xsd 

Quindi, quando si dispone degli oggetti, caricarli in un progetto e serializzarli. È possibile popolare le proprietà e tali se si desidera aggiungere alcuni dati fittizi.

+0

Ci scusiamo per non averlo indicato, voglio che sia fatto esclusivamente all'interno del mio programma. L'informazione più importante che volevo era un metodo o una classe che mi permettesse di analizzare lo schema per qualsiasi informazione di cui ho bisogno. – ipwnponies

1

Ho sanguinato gli occhi con i documenti MSDN e penso di aver percepito un odore. Caricare uno schema utilizzando XmlSchema.Read e compilarlo. La proprietà Elements conterrà una raccolta degli elementi di "livello superiore". Dovrai hardcode il nome qualificato dell'elemento root o qualcosa del genere. Allora è così. Non ho ancora trovato come trovare i 'contenuti' sotto un dato elemento dello schema.

Modifica: ho trovato alcuni percorsi in più ma non è ancora chiaro. XmlSchemaElements ha una proprietà di tipo schema. Questo è semplice o complesso. I tipi complessi nello schema xml possono avere attributi, sequenze, gruppi, ecc. Le sequenze hanno una proprietà chiamata particella che può essere un elemento. E il ciclo si ripete. Ma penso che la parte più difficile nell'implementazione sarebbe quella di assicurarti di coprire tutti i possibili casi (tipo semplice, tipo complesso con attributo, tipo complesso con attributi ed elementi, estensioni, l'intero shebang).

Modifica: utilizzare la proprietà Elemento dell'oggetto XmlSchema per ottenere XmlSchemaElement. Utilizzare la proprietà SchemaType di XmlSchemaElement per ottenere un tipo semplice o complesso. Usa la proprietà Attributo di XmlSchemaComplexType per ottenere attributi o ContentModel per ottenere 'contenuto semplice'/'contenuto complesso' o Particella per ottenere 'sequenza'/'scelta'/'tutto'.Fondamentalmente un sacco di viaggiare verso il basso proprietà e il controllo di tipi e oggetti di fusione a sinistra ea destra e controllando tutte le possibili disposizioni di oggetti xsd. Creare una biblioteca sarebbe lunga, ingombrante e soggetta a errori. E questo è con gli schemi xml, con dtds non voglio neanche cominciare a pensare. Wow, gli schemi xml sono necessari ma perché devono essere così malvagi.