[XML/XSD] Esprimere vincoli in base al contenuto di un tag

di il
2 risposte

[XML/XSD] Esprimere vincoli in base al contenuto di un tag

Salve, me ne intendo poco/discretamente sugli schemi XSD. Generalmente per scenari "semplici" sono in grado di comprendere un XSD esistente o di farne uno nuovo a mano.
Adesso però, per lavoro, ho bisogno di realizzare uno schema XSD per un tipo di validazione un po' particolare, in cui certi vincoli (es. un elemento obbligatorio o no) dipendono dal contenuto di un altro elemento nel documento.
Con un esempio sarà più chiaro:

XML

<elemento>
    <contesto>A</contesto>
    <nome>Andrea</nome>
      .....molti altri tag......
</elemento>
È possibile con un file XSD "esprimere" la seguente logica di validazione:
- se il contenuto di <contesto> è "A", allora <nome> è obbligatorio (minOccurs="1").
- se il contenuto di <contesto> è "B", allora <nome> non è obbligatorio (minOccurs="0").
?

Note:
- i nomi dei tag e i valori descritti sono puramente di esempio.
- il tag <elemento> non è necessariamente la "radice" (nel mio caso reale sarà quasi sicuramente il primo e unico elemento figlio del tag radice).

Chiarisco anche il contesto. Il XSD servirebbe poi per validare il "body" di un messaggio SOAP in input gestito tramite la API JAX-WS in Java.

Grazie per qualunque suggerimento. Se qualcosa non è chiaro o richiede ulteriori indicazioni da parte mia, fatemelo sapere.

2 Risposte

  • Re: [XML/XSD] Esprimere vincoli in base al contenuto di un tag

    No.
    E se ci pensi, sarebbe anche alquanto complicato implementare dei test del genere.

    In questi casi, il miglior approccio e'

    1) una validazione di massima fatta con il XSD,
    2) una validazione fine via codice.

    In ogni caso, una buona implementazione di un servzio SOAP dovrebbe comunque validare da codice i parametri che riceve (sia dal punto di vista sintattico che semantico), per poter fornire al client una segnalazione di errore il piu' presto e puntuale possibile.
  • Re: [XML/XSD] Esprimere vincoli in base al contenuto di un tag

    Scusa se rispondo solo ora. Grazie per la risposta.

    migliorabile ha scritto:


    No.
    E se ci pensi, sarebbe anche alquanto complicato implementare dei test del genere.
    Ok e infatti ... immaginavo già che non è possibile (avevo fatto qualche ricerca in rete e ho avuto fin da subito questo sospetto).

    migliorabile ha scritto:


    In questi casi, il miglior approccio e'

    1) una validazione di massima fatta con il XSD,
    2) una validazione fine via codice.
    Sì, ho discusso della tua risposta ieri con il collega che segue il progetto con me. Alla fine abbiamo deciso di fare proprio così. Stamattina ho implementato nel XSD delle validazioni di "massima": controlli di lunghezze max, di pattern, di enumerazioni di N valori possibili e cose del genere.
    Poi le validazioni più critiche e che coinvolgono più campi (es. quella citata: se un dato contiene A, un altro dato è obbligatorio) le implementerò con del codice. Ovviamente cercando di incapsulare bene la validazione e renderla minimale e facilmente mantenibile.
Devi accedere o registrarti per scrivere nel forum
2 risposte