Come impostare il minOccurs="1" nell'xsd generato

venerdì 29 novembre 2013 - 15.21
Tag Elenco Tags  C#  |  .NET 4.0

ignaxio Profilo | Newbie

Ciao a tutti,
non riesco a generare il minOccurs="1" nell'xsd generato dal mio WS pubblicato con c#

Secondo http://msdn.microsoft.com/en-us/library/zds0b35c(v=vs.100).aspx per forzare l'1 bisogna valorizzare i gli attributi IsNullable = true (ed è stato fatto ovunque) oppure non prevedere un valore di default (e non so esattamente come fare)

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Le sto provando tutte,

la chiamata è così composta

[WebMethod] public FamigliaCollection SelFamRet(InputDataF1 data) { FamigliaCollection result = new FamigliaCollection(); if (data != null) { SQLRequester.ExecuteReader("R001SEL.sql", data, result); } return result; }

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Qualche idea?


0v3rCl0ck Profilo | Guru

parli di questo elemento?

- <xs:complexType name="ArrayOfFamiglia">
- <xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Famiglia" nillable="true" type="tns:Famiglia" />
</xs:sequence>
</xs:complexType>



Michael Denny
Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

ignaxio Profilo | Newbie

esatto.

Ne' quello che ha trovato, ne'

<xs:complexType>
- <xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="SelFamRetResult" type="tns:FamigliaCollection" />
</xs:sequence>
</xs:complexType>

0v3rCl0ck Profilo | Guru

guardando meglio ho notato che il minOccurs="0" compare in due casi diversi:

1 - nell'elemento contenuto in una collezione

- <xs:complexType name="ArrayOfFamiglia">
- <xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Famiglia" nillable="true" type="tns:Famiglia" />
</xs:sequence>
</xs:complexType>

2 - e sulla collezione stessa

<xs:element minOccurs="0" maxOccurs="1" name="SelFamRetResult" type="tns:FamigliaCollection" />
</xs:sequence>
</xs:complexType>
</xs:element>

mi confermi che vorresti quei due minOccurs settati ="1" ?

Michael Denny
Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

ignaxio Profilo | Newbie

sì, mi serve l'1 in entrambi.

Hai qualche idea?

0v3rCl0ck Profilo | Guru

Prova partendo dall'xsd che vorresti, e facendo generare la classe dal tool xsd.exe

http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx

ho creato un file "schema-fam.xsd" contenente il tuo xsd, leggermente sistemato (tu puoi prendere quello completo che hai), e modificando i minOccurs="0" a minOccurs="1":

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

dal "Developer Command Prompt" o "Visual Studio Command Prompt" ho lanciato l'istruzione:

xsd.exe schema-fam.xsd /classes

e mi ha generato il codice c# corrispondente alle classi definite nell'xsd:

//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // Runtime Version:4.0.30319.18051 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ using System.Xml.Serialization; // // This source code was auto-generated by xsd, Version=4.0.30319.17929. // /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] public partial class SelFamRetResponse { private FamigliaCollection selFamRetResultField; /// <remarks/> public FamigliaCollection SelFamRetResult { get { return this.selFamRetResultField; } set { this.selFamRetResultField = value; } } } /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] public partial class FamigliaCollection { private Famiglia[] collectionField; private Result resultField; /// <remarks/> [System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)] public Famiglia[] Collection { get { return this.collectionField; } set { this.collectionField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public Result Result { get { return this.resultField; } set { this.resultField = value; } } } /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] public partial class Famiglia { private string famigliaProdottoField; private string id_FamigliaProdottiField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string FamigliaProdotto { get { return this.famigliaProdottoField; } set { this.famigliaProdottoField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string Id_FamigliaProdotti { get { return this.id_FamigliaProdottiField; } set { this.id_FamigliaProdottiField = value; } } } /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] public partial class Result { private string codField; private string descriptionField; private string longDescriptionField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string Cod { get { return this.codField; } set { this.codField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string Description { get { return this.descriptionField; } set { this.descriptionField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string LongDescription { get { return this.longDescriptionField; } set { this.longDescriptionField = value; } } }

poi ho provato il procedimento inverso, compilando in una dll il file c# generato:

xsd.exe ClassLibrary1.dll

ma mi ha generato il tuo stesso xsd con i minOccurs="0":

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

a questo punto direi che probabilmente non è possibile settare il minOccurs="1" in quei punti, bisognerebbe ripartire dalle tue esigenze, e cioè come mai vuoi il minOccurs="1" in quei punti, quali sono le tue esigenze? e da li ripartire, ed investigare se e come la tua esigenza può essere scritta in xsd.

spero di averti dato un po' di materiale utile su cui potere lavorare


Michael Denny
Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

ignaxio Profilo | Newbie

Ciao, grazie.

Purtroppo avevo già fatto questo procedimento ottenendo lo stesso risultato.
Adesso sto lavorando su questo articolo
http://thorarin.net/blog/post/2010/08/08/Controlling-WSDL-minOccurs-with-WCF.aspx

ma che funziona solo per i messaggi di input. Bisognerebbe adattare il codice per l'output ma con un po' di difficoltà.

Spero di trovare presto una soluzione.

PS: la necessità di avere quel parametro è dettato da esigenze del Client.

bobo89 Profilo | Junior Member

Caspita il post è vecchio, comunque se può servire a qualcuno in grammatica XMLSchema minOccurs e maxOccurs hanno come valore di default 1.
Zito Piero
info@makerit.it
http://www.makerit.it
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5