Domanda

Vorrei sapere il metodo migliore per risolvere questo problema: Vorrei creare un modello vuoto xml da uno schema xml. Tutti gli elementi e gli attributi richiesti verrebbero creati e i loro valori sarebbero tutte stringhe vuote.

Il prossimo passo è come determinare quali nodi xml figlio potrebbe avere un determinato nodo. per esempio. Vorrei selezionare un nodo che ha minOccurs = " 0 " ;, maxOccurs = " unbounded " 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 alla 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 tentano di aggiungere elementi secondari al nodo dell'account e le opzioni sono nome nodo (richiesto), nodo password (richiesto), nodo impostazioni (facoltativo), ecc. Come posso determinare a livello di programmazione a quali figli il nodo account è disponibile 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 usare per leggere uno schema e analizzarlo per ottenere informazioni utili per la creazione di un XML? Nella mia ingenuità avevo speranza che, dato che xsd era xml in sé, ci sarebbe stata una sorta di modello DOM che avrei potuto attraversare.

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

È stato utile?

Soluzione

Sembra che ciò che si desidera fare sia replicare la funzionalità di XML intellisense nella maggior parte dei buoni editor XML. cioè leggere uno schema xml e capire quali elementi e attributi possono venire dopo.

Abbiamo fatto qualcosa di molto simile in un progetto a cui abbiamo lavorato qualche tempo fa. Produrre qualcosa che funzioni per la maggior parte del tempo è un sacco di lavoro, produrre qualcosa che funziona sempre è un sacco di lavoro!

Fondamentalmente devi caricare l'XSD (gli oggetti XmlSchema in .net ti permettono di farlo). Ma il modello a oggetti SOM che espongono è molto grezzo, quindi è necessario fare molto lavoro per interpretarlo. Se ignori concetti come gruppi di sostituzione, estensione complexType, schemi camaleontici e namespace, dovresti essere in grado di navigare ragionevolmente facilmente nella SOM.

Successivamente dovrai capire dove ti trovi nel documento XML in relazione al tuo schema. Una volta saputo di essere nella SOM, puoi iniziare a elaborare le opzioni disponibili.

Per fare questo in modo corretto sono 1.000 'di righe di codice e 4-12 settimane di lavoro. Potresti riuscire a mettere insieme qualcosa di semplice in poche settimane?

Altri suggerimenti

Mi sono fatto sanguinare gli occhi con i documenti MSDN e penso di aver percepito un profumo. Carica uno schema usando XmlSchema.Read e compilarlo. La proprietà Elements conterrà una raccolta di elementi di "livello superiore". Dovrai codificare il nome qualificato dell'elemento radice o qualcosa del genere. Allora è tutto. Non ho ancora trovato il modo di trovare i "contenuti" in un determinato elemento dello schema.

Modifica: ho trovato altri percorsi da percorrere ma non è ancora cristallino. XmlSchemaElements ha una proprietà del tipo di 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 difficile dell'implementazione sarebbe quella di assicurarti di coprire tutti i possibili casi (tipo semplice, tipo complesso con attributo, tipo complesso con attributo ed elementi, estensioni, l'intero shebang).

Modifica: usa la proprietà Element dell'oggetto XmlSchema per ottenere un XmlSchemaElement. Utilizzare la proprietà SchemaType di XmlSchemaElement per ottenere un tipo semplice o complesso. Utilizzare la proprietà Attribute 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 giù per le proprietà e controllare i tipi e lanciare oggetti a destra e sinistra e controllare tutte le possibili disposizioni degli oggetti xsd. Creare una libreria sarebbe lungo, ingombrante e soggetto a errori. E questo è con schemi xml, con dtds non voglio nemmeno iniziare a pensare. Wow, sono necessari schemi xml ma perché devono essere così malvagi.

puoi utilizzare uno strumento di terze parti come XMLSPY ( link ). produrrà un xml fittizio da xsd o viceversa.

Un modo veramente circolare (ma gratuito) che potresti fare con gli strumenti .NET presenti sul tuo computer sarebbe usare xsd.exe ( link ) per generare gli oggetti entità definiti dallo schema usando quanto segue:

xsd /classes /language:CS XSDSchemaFile.xsd

Quindi quando hai gli oggetti, caricali in un progetto e serializzali. È possibile popolare proprietà e simili se si desidera aggiungere alcuni dati fittizi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top