Modo standard per consentire dati XML generali

2

Sto scrivendo un'applicazione per la raccolta e la segnalazione di dati che accetta file XML come input, che verranno quindi letti, elaborati e archiviati in un database strongmente tipizzato. Ad esempio, un file XML per un "Job" potrebbe assomigliare a questo:

<Data type="Job">
    <ID>12345</ID>
    <JobName>MyJob</JobName>
    <StartDate>04/07/2012 10:45:00 AM</StartDate>
    <Files>
        <File name="a.jpeg" path="images\" />
        <File name="b.mp3" path="music\mp3\" />
    </Files>
</Data>

Mi piacerebbe utilizzare uno schema per avere un formato standard per questi file di input (a seconda del tipo di dati utilizzati, ad esempio "Lavoro", "Utente", "Visualizza"), ma vorrei piace anche non fallire la convalida se ci sono dati extra forniti.

Ad esempio, forse un lavoro ha proprietà aggiuntive come "IsAutomated", "Requester", "EndDate" e così via. Non mi interessa particolarmente queste proprietà extra. Se sono inclusi nell'XML, li ignorerò semplicemente mentre sto elaborando il file XML e mi piacerebbe che la convalida faccia lo stesso, senza dover includere nello schema ogni singola possibile proprietà che un cliente potrebbe fornire io con.

Esiste un modo standard per fornire uno schema di questo tipo o di consentire un tale file XML generale che può ancora essere convalidato senza ricorrere a qualcosa di così ingenuo (e potenzialmente difficile da gestire) come sotto?

<Data type="Job">
    <Data name="ID">12345</Data>
    . . .
    <Data name="Files">
        <Data name="File">
            <Data name="Filename">a.jpeg</Data>
            <Data name="path">images</Data>
        . . .
    </Data>
</Data>
    
posta Greg Jackson 07.04.2012 - 19:55
fonte

2 risposte

1

XSD è la strada da percorrere se il tuo formato file è XML - questo è esattamente il tipo di compito per cui XSD è pensato e in questo spazio brilla davvero.

Per gestire gli elementi opzionali puoi fare due cose. Il primo è definirli come attributi facoltativi usando minOccours="0" . Se hai già qualcosa di più complesso, puoi utilizzare anche la direttiva processContents="lax" .

    
risposta data 07.04.2012 - 22:36
fonte
0

In realtà sto lavorando a qualcosa di simile e ho deciso di utilizzare un file JSON sul server che descrive quale tipo di elementi / attributi sono consentiti.

Quando un utente carica un file XML, può essere confrontato con il file di dati sul server attraverso uno script e gli elementi o gli attributi con sintassi errata possono essere rifiutati.

Per quanto riguarda un modo standard per farlo, non ne sono a conoscenza, sebbene questo metodo abbia funzionato abbastanza bene per me finora.

Ecco come appare il mio oggetto JSON di prova:

EDIT : in realtà è un oggetto letterale, ma qualunque cosa;)

XMLTemplate = {
    xml         : '<?xml version="1.0" encoding="UTF-8" ?>',
    doctype     : '<!DOCTYPE xml PUBLIC>',
    children    : [{

                   name     : "ROOT",
                   description  : "All xml documents have a root tag",


                   children : [{
                               name         : "GROUP",
                               description  : "Groups contain products, as well as some fields",
                               attributes   : [{
                                               name         : "TYPE",
                                               description  : "What type of product"
                                               },{
                                               name         : "DESCRIPTION",
                                               description  : "Group Description"
                                               }],

                               children : [{

                                           name         : "TITLE",
                                           description  : "Title of the group"

                                           },{

                                           name         : "DESCRIPTION",
                                           description  : "Group description",


                                           attributes   : [{
                                                           name         : "SOMETHINGELSE",
                                                           description  : "some other attribute I don't know"
                                                           },{
                                                           name         : "WIDTH",
                                                           description  : ""
                                                           }]

                                           },{

                                           name         : "PRODUCT",
                                           description  : "Products contain some stuffs",
                                           attributes   : [{
                                                           name : "TYPE",
                                                           description  : "type of product"
                                                           },{
                                                           name         : "SOMETHINGELSE",
                                                           description  : "some other attribute I don't know"
                                                           }],


                                           }]


                               }]
                   }]
}
    
risposta data 07.04.2012 - 20:16
fonte

Leggi altre domande sui tag