Ho ricevuto un XSD da un fornitore di terze parti generato da un sistema basato su Java; che deve essere utilizzato per creare un endpoint SOAP per consentirci di ricevere trasferimenti di dati. Il loro XSD non fa alcun uso dell'attributo nillable definito all'interno dello spazio dei nomi W3C / XSD, ad esempio:
<xs:complexType name="Customer">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="ID" type="xs:integer"/>
<xs:element minOccurs="0" maxOccurs="1" name="TitleID" type="xs:integer"/>
<xs:element minOccurs="0" maxOccurs="1" name="FirstName" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="FamilyName" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="PreviousName" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="DateOfBirth" type="xs:date"/>
</xs:sequence>
</xs:complexType>
Parlando con il fornitore è stato menzionato " where minOccurs="0"
e il loro valore non è presente, gli elementi verranno omessi".
Quando usiamo lo Strumento di definizione dello schema XSD per creare classi; le classi vengono generate correttamente con 2 eccezioni: le proprietà DateOfBirth e TitleID non sono annullabili.
A meno che nillable="true"
sia dichiarato all'interno dell'XSD per tipi semplici, tipi di valore o non creati come Nullable nonostante la configurazione minOccurs="0"
. Dopo alcune ricerche ritengo che questa interpretazione sia corretta, date informazioni nei seguenti articoli:
Ho concluso da quanto sopra che minOccurs="0"
è una definizione che afferma che l'elemento all'interno di XML è facoltativo, ma non ha alcun significato particolare. È chiaro che all'interno di un messaggio SOAP; per non comunicare alcun valore per un particolare elemento, nill="true"
deve essere utilizzato all'interno di un elemento vuoto.
Presentando questo al nostro fornitore; Ho sostenuto che gli attributi nillable mancanti lasciano l'XSD ambiguo e manca di intento quando si fa riferimento agli standard, dato che omettere gli elementi non è nullo, è solo implicito. Il W3C indica se un messaggio deve indicare che un elemento è nullo, dovrebbe essere esplicitamente indicato. Il loro rappresentante non era d'accordo e sosteneva che se non ci fosse DateOfBirth (per esempio) rimuoveranno l'elemento per questo nel messaggio SOAP. Ritengono che ciò sia accettabile e conforme agli standard. Da quanto ho letto qui , minOccurs / nillable hanno lo stesso comportamento in Java (forse perché sentono che non devono usare attributi nillable)
So che posso aggirare questo, ma alla fine; esso (potenzialmente) ha un aumento significativo della quantità di codice aggiuntivo richiesto per il bene del nostro fornitore che non desidera utilizzare l'attributo nill / nillable nel messaggio XSD e SOAP. Sto costruendo la nostra API SOAP in WCF; dopo la deserializzazione dovrò controllare tutte le proprietà specificate che vengono generate per verificare la presenza di elementi mancanti. Ciò è dovuto al fatto che i tipi di valore a cui non viene fatto riferimento nel messaggio xml verranno assegnati ai relativi valori predefiniti. In alternativa, potrei passare attraverso l'XSD e aggiungerli da solo, il che credo sia una cattiva idea. Cambierò le loro definizioni e ogni nuova release richiederà lo stesso sforzo, che è attualmente ogni 3-6 mesi.
Le mie domande sono:
- Sei d'accordo con argomenti fatti da me o dal fornitore? Se è così, perché?
- Sono corretto nel mio suggerimento Java tratta queste configurazioni allo stesso modo?
- Se ho torto, c'è un modo in cui posso dire a .Net di creare tipi nullable per
minOccurs="0"
?