Wat is XML
XML staat voor Extensible Markup Language en is een standaard taal van het World Wide Web Consortium.
Met XML kan men gestructureerde gegevens weergeven in de vorm van platte tekst die zowel door een computer als door een mens leesbaar zijn.
Het XML-formaat wordt gebruikt om gegevens op te slaan en/of om gegevens over het internet te versturen.
XML gebruikt elementen en attributen om gegevens te structureren.
Men is echter vrij om de namen voor de elementen en attributen zelf te kiezen gezien de keuze afhangt van wat men met het XML bestand van plan is.
De XML-specificatie definieert enkel de syntaxis van elementen, attributen en de andere structuren die in XML-bestanden kunnen voorkomen.
Wat is LINQ
LINQ staat voor Language Integrated Query. Het is een taal die door Microsoft ontworpen is en deel uit maakt van het .Net framework en derhalve
beschikbaar is in de Express uitgaven van Visual Studio.
LINQ doet denken aan SQL.
SQL staat voor Structured Query Language en is een krachtige taal om relationele databases zoals MS Access, SQL-server... aan te sturen en te bevragen.
De taal is in de jaren 70 door IBM ontwikkeld.
De Syntaxis van LINQ wijkt echter af van deze van SQL. Met LINQ kan men ook gegevens uit XML en Arrays bestanden benaderen.
Vanzelfsprekend ondersteund Visual Basic .NET LINQ.
Met LINQ kan men in VB.net ook XML-bestanden aanmaken.
Bespreking van mijn class clsLinqNaarXml
Door gebruik te maken van deze Class kan men met LINQ XML- bestanden creëren, er data aan toevoegen en data opvragen
Public Class clsLinqNaarXml
Private Shared strmijnData As String = "c:av_VBNETDatawa_Testen_av_2mijnData.xml"
Public Shared Function Geef_mijnData() As XDocument
Try
Dim mijnDoc As XDocument = XDocument.Load(strmijnData)
Return mijnDoc
Catch ex As System.IO.FileNotFoundException
MessageBox.Show(ex.Message)
Return Nothing
End Try
End Function
Public Shared Sub Toev_mijnData(ByVal strNaam As String, ByVal strVNaam As String, ByVal strGesl As String, _
ByVal shtGebJaar As Short)
'Het document inladen
'Dim mijnDoc As XDocument = XDocument.Load("mijnData.xml")
Dim mijnDoc As XDocument = XDocument.Load(strmijnData)
'Nieuw XElement op basis van de parameters
Dim NieuwXElement As New XElement("Persoon", New XElement("Naam", strNaam),
New XElement("VNaam", strVNaam),
New XElement("Gesl", strGesl),
New XElement("GebJaar", shtGebJaar))
'toeveogen aan het in memory element
' mijnDoc.Descendants("Persoon").First.Add(NieuwXElement) toevoegen na eerste element
mijnDoc.Descendants("Datalijst").Last.Add(NieuwXElement)
'naar schijf bewaren
mijnDoc.Save(strmijnData)
End Sub
Public Shared Sub Zoek_OpGels(ByVal strGesl As String)
'Het document inladen
Dim mijnDoc As XDocument = XDocument.Load(strmijnData)
'LINQ expressie opstellen
Dim zoekOpGesl = From Persoon In mijnDoc.Descendants("Persoon")
Where CStr(Persoon.Element("Gesl")) = strGesl
Select Persoon.Element("VNaam").Value
Dim data As String = String.Empty
For Each item In zoekOpGesl.Distinct()
data &= String.Format("- {0}" & vbLf, item)
Next
MessageBox.Show(data, String.Format("{0} Voornaam is:", strGesl))
End Sub
Public Shared Sub Toev_Lijst(ByVal intIDData As Integer, ByVal strTypeData As String, ByVal strNaamData As String _
, ByVal strOmschrData As String, ByVal strPadBest As String)
Dim mijnDocX As XDocument = XDocument.Load(strPadBest)
Dim NieuwXElement As New XElement("Data",
New XElement("IDData", intIDData), _
New XElement("TypeData", strTypeData), _
New XElement("NaamData", strNaamData), _
New XElement("OmschrData", strOmschrData))
mijnDocX.Descendants("Lijst").Last.Add(NieuwXElement)
mijnDocX.Save(strPadBest)
End Sub
Public Shared Sub MaakNieuwe_Lijst(ByVal strPadBest As String, ByVal intIDData As Integer, ByVal strTypeData As String,
ByVal strNaamData As String, ByVal strOmschrData As String)
Dim lijstXDoc As New XElement("Lijst",
New XDeclaration("1.0", "utf-8", "yes"),
New XComment("Een lijst met data!"),
New XElement("Data",
New XElement("IDData", intIDData),
New XElement("TypeData", strTypeData),
New XElement("NaamData", strNaamData),
New XElement("OmschrData", strOmschrData)))
lijstXDoc.Save(strPadBest)
End Sub
End Class
Toepassen van bovenstaande klas op het formulier frmHoofd
Imports System.Xml.Linq
Public Class frmHoofd
Private Sub frmHoofd_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.cbgGeslZ.SelectedText = "Man"
Me.cboGesl.SelectedText = "Man"
Me.txtmijnData.Text = clsLinqNaarXml.Geef_mijnData.ToString
End Sub
Private Sub cmdToevoegen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdToevoegen.Click
clsLinqNaarXml.Toev_mijnData(Me.txtNaam.Text, Me.txtVNaam.Text, Me.cboGesl.Text, Me.txtGebJaar.Text)
Me.txtmijnData.Text = clsLinqNaarXml.Geef_mijnData.ToString
End Sub
Private Sub cmdGeslZ_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdGeslZ.Click
clsLinqNaarXml.Zoek_OpGels(Me.cbgGeslZ.Text)
End Sub
Private Sub cmd_frm_xml_maken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cmd_frm_xml_maken.Click
frmXMLMaken.Show()
frmXMLMaken.Visible = True
End Su
End Class
Hier het formulier waar de class op toegepast wordt.
Berekeningen met LINQ zoals in de class clsDataSpel
Stel een XML bestand ppSpel.xml met volgende structuur:
Ten einde berekeningen te kunnen uitvoeren op dit bestand creëren wij de clsDataSpel
Public Class clsDataSpel
Private Shared _strppData As String = My.Computer.FileSystem.CurrentDirectory & "ppDatappSpel.xml"
Private _datum As String
Public Sub New()
End Sub
Public Shared Function Geef_ppData() As XDocument
Try
Dim mijnDoc As XDocument = XDocument.Load(_strppData)
Return mijnDoc
Catch ex As System.IO.FileNotFoundException
MessageBox.Show(ex.Message & vbCrLf & "Databestand niet gevonden!")
Return Nothing
End Try
End Function
Public Shared Sub Toev_ppData(ByVal strNaam As String, ByVal strDatum As String, ByVal strGewonnen As String)
'Het document inladen
Dim mijnDoc As XDocument = XDocument.Load(_strppData)
'Nieuw XElement op basis van de parameters
Dim NieuwXElement As New XElement("resultaat", New XElement("naam", strNaam),
New XElement("datum", strDatum),
New XElement("gewonnen", strGewonnen))
'toevoegen aan het in memory element
mijnDoc.Descendants("spel").Last.Add(NieuwXElement)
'naar schijf bewaren
mijnDoc.Save(_strppData)
End Sub
Public Shared Function Aant_Spel() As Integer
Dim mijnDoc As XDocument = XDocument.Load(_strppData)
Dim Aant As Integer = (From a In mijnDoc.Descendants("resultaat") Select a).Count
Return Aant
End Function
Public Shared Function pp_Gewonnen() As Integer
Dim mijnDoc As XDocument = XDocument.Load(_strppData)
Dim Aant As Integer = (From a In mijnDoc.Descendants("resultaat") Where a.Element("gewonnen") = "n" Select a).Count
Return Aant
End Function
Public Shared Function Naam_Aant_Spel(ByVal strNaam As String) As Integer
Dim mijnDoc As XDocument = XDocument.Load(_strppData)
Dim Aant As Integer = (From a In mijnDoc.Descendants("resultaat") _
Where CStr(a.Element("naam").Value) = strNaam Select a.Element("naam")).Count
Return Aant
End Function
Public Shared Function Naam_Gewonnen(ByVal strNaam As String) As Integer
Dim mijnDoc As XDocument = XDocument.Load(_strppData)
Dim Aant As Integer = (From a In mijnDoc.Descendants("resultaat") Where a.Element("gewonnen") = "j" _
AndAlso a.Element("naam") = strNaam Select a).Count
Return Aant
End Function
Public Shared Function Namen() As List(Of String)
Dim mijnDoc As XDocument = XDocument.Load(_strppData)
Dim Allenamen = From a In mijnDoc.Descendants("resultaat") Order By a.Element("naam").Value _
Select a.Element("naam").Value Distinct
Dim _Namen As New List(Of String)
For Each strNaam In Allenamen
_Namen.Add(strNaam)
Next strNaam
Return _Namen
Return Nothing
End Function
ReadOnly Property Datum
Get
Datum = _datum
End Get
End Property
Public Shared Function GeefDatum() As String
Return Date.Now.Day.ToString & "/" & Date.Now.Month.ToString & "/" & Date.Now.Year.ToString
End Function
End Class
Bij het opstarten van formulier hieronder wordt gebruik gemaakt van de class clsDataSpel.
Public Class frmStart
Private Sub frmStart_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'lijst vullen van spelers
Dim strNamen As New List(Of String)
strNamen = clsDataSpel.Namen
For intTelNamen = 0 To strNamen.Count - 1
Me.lstSpelers.Items.Add(strNamen(intTelNamen))
Next
Me.lstSpelers.SelectedIndex = 0
'resultaten van pietje pek weergeven
Dim strResulPP As String = "PIETJE PEK speelde " & clsDataSpel.Aant_Spel.ToString & " maal" _
& vbCrLf & " en won " & clsDataSpel.pp_Gewonnen.ToString & " maal !"
Me.lblResul_PP.Text = strResulPP
'resultaten speler blanken
Me.lblResul_Sp.Text = ""
End Sub
Private Sub lstSpelers_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstSpelers.Click
Dim strNaamSpeler As String = Me.lstSpelers.SelectedItem.ToString
Dim strResulSp As String = strNaamSpeler.ToUpper & " speelde " & clsDataSpel.Naam_Aant_Spel(strNaamSpeler).ToString & " maal" _
& vbCrLf & " en won " & clsDataSpel.Naam_Gewonnen(strNaamSpeler).ToString & " maal !"
Me.lblResul_Sp.Text = strResulSp
End Sub
Private Sub lstSpelers_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstSpelers.DoubleClick
Me.txtNaam.Text = Me.lstSpelers.SelectedItem.ToString
End Sub