PDA

View Full Version : [Vb.net e Xml]Uso di appendchild e creazione albero xml


tognesimo
30-04-2009, 08:26
Ciao a tutti, ho un xml con la seguente struttura:

<changes>
<change changedate="2009-04-28T10:30:24" user="Sistema role="Sistema">
<oldvalue>
<stato>9800gt pè gioca a crysys</stato>
</oldvalue>
<newvalue>
<stato>02 - Verifica contabile</stato>
</newvalue>
</change>
</changes>

Volevo replicare questa riga in vb.net.
Ho fatto la seguente porzione di codice:
Dim root = xml_mod.selectSingleNode("//changes")
Dim nodofiglio = xml_mod.createElement("change")

root.appendchild(nodofiglio)

Aggiunge il tag change ma non so come creare gli attributi.

tognesimo
30-04-2009, 09:20
Con questo codice sono riuscito a replicare la tab:


'Creazione riga tabella xml
Dim root = xml_mod.selectSingleNode("//changes")
Dim nodofiglio = xml_mod.createElement("change")
root.appendchild(nodofiglio)
Dim nodofiglio1 = xml_mod.createElement("oldvalue")
nodofiglio.appendchild(nodofiglio1)
Dim nodofiglio2 = xml_mod.createElement("stato")
nodofiglio1.appendchild(nodofiglio2)
Dim nodofiglio3 = xml_mod.createElement("newvalue")
nodofiglio.appendchild(nodofiglio3)
Dim nodofiglio4 = xml_mod.createElement("stato")
nodofiglio3.appendchild(nodofiglio4)

Adesso quello che voglio fare è la selectsinglenode di uno di questi nodi.Come faccio a beccare il nodo giusto?Ci sono almeno 100 tabelle di questo tipo ed ognuna corrisponde ad un record.

MarcoGG
30-04-2009, 09:31
Aggiunge il tag change ma non so come creare gli attributi.


Dim at1 As Xml.XmlAttribute = xml_mod.CreateAttribute("nomeAttributo1")
at1.Value = "valoreAttributo1"
nodofiglio.Attributes.Append(at1)

Dim at2 As Xml.XmlAttribute = xml_mod.CreateAttribute("nomeAttributo2")
at2.Value = "valoreAttributo2"
nodofiglio.Attributes.Append(at2)

'...
'...

tognesimo
30-04-2009, 09:52
Dim at1 As Xml.XmlAttribute = xml_mod.CreateAttribute("nomeAttributo1")
at1.Value = "valoreAttributo1"
nodofiglio.Attributes.Append(at1)

Dim at2 As Xml.XmlAttribute = xml_mod.CreateAttribute("nomeAttributo2")
at2.Value = "valoreAttributo2"
nodofiglio.Attributes.Append(at2)

'...
'...

Grazie marco ma questo codice non funziona, dice:
type xml.xmlattribute non definito

MarcoGG
30-04-2009, 10:36
Grazie marco ma questo codice non funziona, dice:
type xml.xmlattribute non definito

System.Xml.XmlAttribute, non può non funzionare. Non so che versione di VB hai, ma prova ad aggiungere manualmente il Rif. da Proprietà di Progetto...

MarcoGG
30-04-2009, 12:24
Adesso quello che voglio fare è la selectsinglenode di uno di questi nodi.Come faccio a beccare il nodo giusto?Ci sono almeno 100 tabelle di questo tipo ed ognuna corrisponde ad un record.


Una via possibile è qualcosa del genere, utilizzando NodeType, ciclando in ogni nodo e verificandone tipo ed eventuale valore ( nell'esempio lst_xml è una ListBox di controllo... ) :

For Each N As Xml.XmlNode In root.ChildNodes
lst_xml.Items.Add(N.Name)
If N.Attributes.Count > 0 Then
For Each A As Xml.XmlAttribute In N.Attributes
lst_xml.Items.Add(" " & A.Name & " = " & A.Value)
Next
End If
For Each N1 As Xml.XmlNode In N.ChildNodes
Select Case N1.NodeType
Case Xml.XmlNodeType.Element
lst_xml.Items.Add(" " & N1.Name & " = " & N1.InnerText)

'Case ...

'Case ...

Case Else
'...
'...
End Select
Next
Next
O anche renderla ricorsiva per file Xml più complessi... ;)

tognesimo
30-04-2009, 17:36
Una via possibile è qualcosa del genere, utilizzando NodeType, ciclando in ogni nodo e verificandone tipo ed eventuale valore ( nell'esempio lst_xml è una ListBox di controllo... ) :

For Each N As Xml.XmlNode In root.ChildNodes
lst_xml.Items.Add(N.Name)
If N.Attributes.Count > 0 Then
For Each A As Xml.XmlAttribute In N.Attributes
lst_xml.Items.Add(" " & A.Name & " = " & A.Value)
Next
End If
For Each N1 As Xml.XmlNode In N.ChildNodes
Select Case N1.NodeType
Case Xml.XmlNodeType.Element
lst_xml.Items.Add(" " & N1.Name & " = " & N1.InnerText)

'Case ...

'Case ...

Case Else
'...
'...
End Select
Next
Next
O anche renderla ricorsiva per file Xml più complessi... ;)

Grazie dell'aiuto.Ho risolto:)