>Ciao,
Ciao!
>ho il seguente problema: un webservices ha un metodo chiamato
>daidati senza parametri in ingresso, in pratica crea un xml ottenuto
>da una stored procedure con più tabelle e per ognuna ho un for
>xml auto. In pratica quello che ho è una situazione del genere
><autori nome="" cognome=""..../> <autori nome=""..../><titoli
>titolo=""..../><titoli titolo="".../>. Quindi ho più
>tabelle nello stesso file.
>
>Il metodo deve essere consumato da una WebForm che popola delle
>RadioButtonList in base all'entità coivolta.
>
>Io vorrei fare nella PageLoad la seguente cosa
>DataSet ds=new DataSet();
>ds.ReadXml(ws_datidati());
>RadioButtonList1.DataSource=ds.Tables[0].Columns[1];
>RadioButtonList1.DataBind()
>RadioButtonList2.DataSource=ds.Tables[1].Columns[1];
>RadioButtonList2.DataBind()
>
>1)Secondo voi è concettualmente corretto?
Diciamo che puoi seguire quella strada.. ma in quel modo ottieni l'errore seguente
>2)Facendo una prima prova ho ottenuto come errore "Elementi di primo livello multipli" ...?!?!
Questo perchè hai più tag "autori" e manca un nodo root..
nella clausola FOR XML utilizza ROOT.. leggi questo link
http://msdn2.microsoft.com/en-us/library/ms190922.aspx
Eccoti un semplice esempio
Use tempdb;
IF NOT EXISTS (SELECT * FROM sys.tables WHERE Object_ID = Object_ID('ProvaXML'))
CREATE TABLE ProvaXML
(
Id Int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
Nome varchar(30) NOT NULL,
Cognome varchar(30) NOT NULL
)
INSERT ProvaXML
SELECT 'Alessandro','Alpi'
INSERT ProvaXML
SELECT 'Luca','Ferrari'
INSERT ProvaXML
SELECT 'Daniele','Zanella'
INSERT ProvaXML
SELECT 'Michael','Denny'
INSERT ProvaXML
SELECT 'Marco','Rossi'
SELECT
Nome,
Cognome
FROM
ProvaXML
FOR XML AUTO, ROOT
-- elimino la tabella
DROP TABLE ProvaXML
risultato in XML
<root>
<ProvaXML Nome="Alessandro" Cognome="Alpi"/>
<ProvaXML Nome="Luca" Cognome="Ferrari"/>
<ProvaXML Nome="Daniele" Cognome="Zanella"/>
<ProvaXML Nome="Michael" Cognome="Denny"/>
<ProvaXML Nome="Marco" Cognome="Rossi"/>
</root>
come vedi si è aggiunto il nodo che elimina la duplicazione del nodo radice (ne crea uno solo da cui derivano tutti i nodi figli)
>
>Per la prova ho utilizzato ds.ReadXml(@"XMLM.xml"); ds.ReadXml(Server.MatPath(XMLM.xml));
>dove questo era un file xml aggiunto al progetto e dove avevo
>incollato quelli generati dalla stored.
Utilizzare la tua soluzione è una via possibile.
A mio avviso è preferibile la soluzione di "messaggio tipizzato"..
Mi spiego.. Tu puoi farti una classe che mappa direttamente il ritorno del tuo metodo..
La classe identifica l'oggetto che conterrà i risultati della tua query.
Una cosa del tipo:
Class OutputXML
Private _Prop1 as string
Private _Prop2 as int32
Public Property Prop1 as String
Get
return _Prop1
End Get
Set (value as string)
_Prop1 = value
End Set
End Property
Public Property Prop2 as int32
Get
return _Prop2
End Get
Set (value as int32)
_Prop1 = value
End Set
End Property
End Class
E poi nel tuo servizio:
<WebMethod()> _
Public Function DatiDati() As OutputXML
Dim objXML As New OutputXML()
'mappi i risultati della query nelle proprietà dell'oggetto
objXML.Prop1 = "prova"
objXML.Prop2 = 1
return objXML
End Function
La Web Form poi leggerà dal metodo il tipo di ritorno OutputXML e lo utilizzerà di conseguenza per popolare i radio button:
...
Dim objRetXML as New OutputXML()
RadioButtonList1.DataSource = objRetXML
RadioButtonList1.DataBind()
...
Attenzione, non l'ho indicato nella classe OutputXML.. Ma per ottenere un oggetto che può essere utilizzato come datasource, devi implementare l'interfaccia IList.
http://msdn2.microsoft.com/en-us/library/system.collections.ilist.aspx
>
>Grazie
Di nulla!
Alx81 =)
http://blogs.dotnethell.it/suxstellino