Vb.net da dataset > xml con controllo se esiste o no un nodo

sabato 01 febbraio 2014 - 17.59
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows Server 2008 R2  |  Access (.mdb)

sandrino71 Profilo | Newbie

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 )

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














0v3rCl0ck Profilo | Guru

>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

sandrino71 Profilo | Newbie

Ciao,
grazie mille per la tua esauriente spiegazione.

alx_81 Profilo | Guru

>Ciao,
>grazie mille per la tua esauriente spiegazione.
ciao,
se ritieni che la risposta ti abbia aiutato a risolvere il problema, ti chiedo di accettarla, per chiudere il thread e farlo apparire come utile anche agli altri che ci seguono.
Grazie in anticipo.

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5