>Ciao, è il mio primo post e sono agli inizi con .net !!
>Dunque ho questo problema:
>Ho un WS con un dataset con un metodo che restituisce un xml
>------------------------------------------
>Dim xmlticket As String = Path.Combine("c:\pippo", "ticket.xml")
>
>Dim scaricoticket As New ServiceReference1.WebServiceSoapClient
> Dim odsnew3 As DataSet = scaricoticket.ticket
> odsnew3.WriteXml(xmlticket)
>--------------------------------------------------------------
>
>1 problema: come mai non mi scrive i nodi vuoti ( il db è un
>Access con alcuni dei campi vuoti )
è del tutto normale e corretto che non ti scriva il nodo/attributo quando il dato rappresentato è null, perchè è il modo in cui un semplice xml può rappresentare il null di un entità. Ad esempio per le stringhe, se si mettesse un nodo vuoto <nodo/> questo verrebbe interpretato come stringa vuota, e non come null.
Il modo per capire che esiste una "colonna" ma che il suo valore è null, è associando all'xml anche uno schema dove viene dichiarata questa colonna, per cui chi va a rileggere l'xml sa che esiste una colonna, e quando scopre che è omessa, comunque sa cosa fare, e valorizza l'entità con il null (altrimenti senza schema ti becchi una bella eccezione).
Un altro modo per fare capire che il nodo è null, è con l'attributo xsi:nil, dove il nodo null viene si rappresentato sempre da un nodo vuoto, ma con l'aggiunta dell'attributo xsi:nil per fare capire che il nodo è null è non stringa vuota <nodo xsi:nil="true"/> ma anche in questo caso chi rilegge il dato, deve essere in grado di interpretare questa informazione.
>
>Pensavo a questo punto di ciclare il file xml e verificare se
>esite o no il nodo e nel caso aggiungerlo
>----------------------------------------------------
>
>Private Sub controllonodi()
>Dim miofile As String = Path.Combine("c:\pippo", "ticket.xml")
> Dim doc As New XmlDataDocument()
> doc.Load(miofile)
> Dim element As XmlElement = doc.DocumentElement
> Dim node As XmlNode = element.FirstChild
>
>
> For Each node In element.ChildNodes
>If node.Name.Equals("dataservizio") Then
>
> End
> Else
> Dim anode As XmlNode
>anode = doc.CreateNode(XmlNodeType.Element, "dataservizio", "")
> anode.InnerText = "00000"
> node.AppendChild(anode)
> doc.Save(miofile)
> End If
>
> Next
>
>
> End Sub
>---------------------------------------------------
>Purtroppo il codice sopra aggiunge sempre il nodo anche se è
>già presente nel file
>Grazie a tutti per l'aiuto
>Ciao
per raggiungere questo obiettivo puoi semplicemente impostare un defaultValue a tutte le colonne del tuo datatable:
For Each dc As DataColumn In dt.Columns
If dc.DataType = GetType(Integer) Then
dc.DefaultValue = 0
End If
If dc.DataType = GetType(String) Then
dc.DefaultValue = ""
End If
Next
però ricordati che così chi rileggerà le tuo informazioni, al posto dei null avrà quei default.
altrimenti sarebbe meglio allegare semplicemente uno schema xml:
DataSet.WriteXMLSchema(fileSchema)
DataSet.ReadXMLSchema(fileSchema)
DataSet.ReadXML(file)
oppure scrivendo lo schema direttamente nel file xml (con un po' pià di overhead):
DataSet.WriteXml(file, XmlWriteMode.WriteSchema)
DataSet.ReadXml(file, XmlReadMode.ReadSchema)
ciao,
Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic