Multidesk.be » Forums » ASP » XML bestand uitlezen

  • Pagina
  • 1 van 1
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door Ezio op zaterdag 14 juni 2014 om 22:04:14.
Ezio's avatar
Multiviteit: 973
Zoals de titel al doet vermoeden wil ik graag een XML bestand uitlezen via Visual Basic. Veel meer dan dat moet er ook niet gebeuren :)

Online vond ik deze code: http://pastebin.com/7bdDbMGv

Ik geraak echter niet verder dan de declaratie van de XMLTextReader:

CODE
  1. Dim document As XmlReader = New XmlTextReader(ComboBox1.Text.ToString())


Intellisense stelt namelijk 'XmlTextReader' niet voor. Wel kan ik kiezen voor XmlReader.

Ik heb 'System.xml' reeds ge´mporteerd. Wat kan er nog misgelopen zijn? :)


I'm a gamer because I don't have a life... I've chosen to have many
^ Reactie #1 geschreven door thekid op zondag 15 juni 2014 om 20:09:58.
thekid's avatar
Multiviteit: 5273
Moderator
Heb je nog toegang tot onze gedeelde workspace? Ik heb anders dat testprojectje upgedate met een pagina die deze xml inleest ;)

Je kan een xml document ook "Typed" inlezen, op volgende manier:
CODE
  1. <?xml version="1.0"?>
  2. <RootNode Title='Example'>
  3.     <IntElement>10</IntElement>
  4.     <Option>Option 1</Option>
  5.     <Option>Option 2</Option>
  6.     <Option>Fifty</Option>
  7. </RootNode>
  8.  


met deze klasse
CODE
  1. Imports System.Xml.Serialization
  2.  
  3. <XmlRoot("RootNode")>
  4. Public Class XmlTestModel
  5.     <XmlAttribute("Title")>
  6.     Public Property Titel As String
  7.     <XmlElement("IntElement")>
  8.     Public Property IntNode As Integer
  9.     <XmlElement("Option")>
  10.     Public Property Options As String()
  11.  
  12.     Public Sub New()
  13.         ' empty constructor
  14.     End Sub
  15. End Class
  16.  


en deze reader
CODE
  1. Imports System.Xml.Serialization
  2. Imports System.IO
  3.  
  4. Public Class XmlBroker(Of T)
  5.  
  6.     Private _fileName As String
  7.     Public Property FileName As String
  8.         Get
  9.             Return _fileName
  10.         End Get
  11.         Set(value As String)
  12.             _fileName = value
  13.         End Set
  14.     End Property
  15.  
  16.     Public Function FromString(xml As String) As T
  17.         Dim serializer As New XmlSerializer(GetType(T))
  18.         Dim content As T
  19.         Try
  20.             Using ms As New MemoryStream
  21.                 Dim bt = System.Text.Encoding.UTF8.GetBytes(xml)
  22.                 ms.Write(bt, 0, bt.Length)
  23.  
  24.                 ms.Seek(0, SeekOrigin.Begin)
  25.                 content = serializer.Deserialize(ms)
  26.             End Using
  27.         Catch ex As Exception
  28.             System.Diagnostics.Debug.WriteLine("Error reading XML: " & vbCrLf & ex.Message & vbCrLf & ex.ToString)
  29.             Return Nothing
  30.         End Try
  31.         Return content
  32.     End Function
  33.  
  34.     Public Function Read() As T
  35.         Dim serializer As New XmlSerializer(GetType(T))
  36.         Dim content As T
  37.  
  38.         Try
  39.             Using fileStream As New FileStream(Me.FileName, FileMode.Open, FileAccess.Read)
  40.                 content = serializer.Deserialize(fileStream)
  41.             End Using
  42.         Catch ex As Exception
  43.             System.Diagnostics.Debug.WriteLine("Error reading XML: " & vbCrLf & ex.Message & vbCrLf & ex.ToString)
  44.         End Try
  45.         Return content
  46.     End Function
  47.  
  48.     Public Function Write(content As T) As Boolean
  49.         Dim success As Boolean = True
  50.         Dim serializer As New XmlSerializer(GetType(T))
  51.  
  52.         Try
  53.             Using fileStream As New FileStream(Me.FileName, FileMode.Create, FileAccess.Write)
  54.                 serializer.Serialize(fileStream, content)
  55.                 fileStream.Flush()
  56.             End Using
  57.             success = True
  58.         Catch ex As Exception
  59.             success = False
  60.             System.Diagnostics.Debug.WriteLine("Error writing XML: " & vbCrLf & ex.Message & vbCrLf & ex.ToString)
  61.         End Try
  62.  
  63.         Return success
  64.     End Function
  65.  
  66.     Public Sub New(fileName As String)
  67.     End Sub
  68. End Class
  69.  


het uiteindelijke inlezen kan dan als volgt:
CODE
  1. Dim broker As New XmlBroker(Of XmlTestModel)(String.Empty)
  2.  
  3.         Dim output = broker.FromString("<?xml version=""1.0""?>" & vbCrLf & _
  4.                           "<RootNode Title='Example'><IntElement>10</IntElement><Option>Option 1</Option><Option>Option 2</Option><Option>Fifty</Option></RootNode>")
  5.  
  6.         Dim lt As New LiteralControl()
  7.         lt.Text = "Titel: " & output.Titel & "<br />IntElement: " & output.IntNode & "<br /><ul>"
  8.         For Each i In output.Options
  9.             lt.Text &= "<li>" & i & "</li>"
  10.         Next
  11.         lt.Text &= "</ul>"
  12.         pnlTarget.Controls.Add(lt)
  13.  
Deze tekst werd het laatst bewerkt voor 9.97 % door thekid op zondag 15 juni 2014 om 20:15:23.
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #2 geschreven door Ezio op zondag 15 juni 2014 om 20:33:13.
Ezio's avatar
Multiviteit: 973
Enorm bedankt voor de code, maar hij lijkt een heel stuk ingewikkelder dan ik verwacht had :P

Onze leerkracht zei dat we op het examen de opdracht zouden krijgen om bijvoorbeeld een waarde uit een XML bestand te plukken en deze te tonen in een label. De enige aanwijzing die we kregen was XMLTextReader, de rest moesten we zelf uitzoeken.

Ik heb nog toegang tot de workspace, maar hoe kan ik die .sln juist openen? :)

http://i.snag.gy/mYvhL.jpg


I'm a gamer because I don't have a life... I've chosen to have many
^ Reactie #3 geschreven door thekid op zondag 15 juni 2014 om 23:20:14.
thekid's avatar
Multiviteit: 5273
Moderator
Zoals bij alles hangt het er ook vanaf hoe complex de data is die je wenst in te lezen

Hier heb je een vergelijking om bvb wagens in te lezen:
CODE
  1. Imports System.Xml.Serialization
  2. Imports System.IO
  3. Imports System.Xml
  4.  
  5. Module Module1
  6.  
  7.     Function LeesWagenLijst_Serializer() As List(Of Wagen)
  8.         Dim wagens As New List(Of Wagen)
  9.         Dim wagenLijst As WagenLijst
  10.         Dim serializer As New XmlSerializer(GetType(WagenLijst))
  11.  
  12.         Try
  13.             Using fs As New FileStream("./WagenLijst.xml", FileMode.Open, FileAccess.Read)
  14.                 wagenLijst = serializer.Deserialize(fs)
  15.                 If wagenLijst IsNot Nothing And wagenLijst.Wagens IsNot Nothing Then
  16.                     wagens.AddRange(wagenLijst.Wagens)
  17.                 End If
  18.             End Using
  19.         Catch ex As Exception
  20.             Console.WriteLine("Kon wagenlijst niet inlezen!" & vbCrLf & ex.Message & vbCrLf & ex.StackTrace)
  21.         End Try
  22.  
  23.         Return wagens
  24.     End Function
  25.  
  26.     Function LeesWagenLijst() As List(Of Wagen)
  27.         Dim wagens As New List(Of Wagen)
  28.  
  29.         Using fs As New FileStream("./WagenLijst.xml", FileMode.Open, FileAccess.Read)
  30.             Dim document As New XmlTextReader(fs)
  31.  
  32.             While document.Read()
  33.                 Dim nodeType = document.NodeType
  34.  
  35.                 If (nodeType = XmlNodeType.Element) Then
  36.                     If (document.Name.Equals("Wagen", StringComparison.OrdinalIgnoreCase)) Then
  37.                         Dim w As New Wagen()
  38.                         w.ID = Convert.ToInt32(document.GetAttribute("ID"))
  39.                         While document.Read()
  40.                             If (document.NodeType = XmlNodeType.EndElement AndAlso document.Name.Equals("Wagen")) Then
  41.                                 Exit While
  42.                             End If
  43.                             If (document.NodeType = XmlNodeType.Element) Then
  44.                                 Dim name As String = document.Name
  45.                                 Dim value As String = document.ReadInnerXml.ToString()
  46.                                 If (name.Equals("Merk", StringComparison.OrdinalIgnoreCase)) Then
  47.                                     w.Merk = value
  48.                                     Continue While
  49.                                 End If
  50.                                 If (name.Equals("Model", StringComparison.OrdinalIgnoreCase)) Then
  51.                                     w.Model = value
  52.                                     Continue While
  53.                                 End If
  54.                                 If (name.Equals("NrPlaat", StringComparison.OrdinalIgnoreCase)) Then
  55.                                     w.NrPlaat = value
  56.                                     Continue While
  57.                                 End If
  58.                                 If (name.Equals("ChassisNr", StringComparison.OrdinalIgnoreCase)) Then
  59.                                     w.ChassisNr = value
  60.                                     Continue While
  61.                                 End If
  62.                                 If (name.Equals("Current", StringComparison.OrdinalIgnoreCase)) Then
  63.                                     w.Current = value.Equals("true", StringComparison.OrdinalIgnoreCase) Or value.Equals("1", StringComparison.OrdinalIgnoreCase)
  64.                                     Continue While
  65.                                 End If
  66.                             End If
  67.                         End While
  68.                         wagens.Add(w)
  69.                     End If
  70.                 End If
  71.             End While
  72.         End Using
  73.  
  74.         Return wagens
  75.     End Function
  76.  
  77.     Sub Main()
  78.         Dim wagens As List(Of Wagen) = LeesWagenLijst()
  79.         Dim wagens_serializer As List(Of Wagen) = LeesWagenLijst_Serializer()
  80.  
  81.         Console.WriteLine("Aantal auto's gelezen met xmlTextreader: {0}", wagens.Count)
  82.         For Each Wagen As Wagen In wagens
  83.             Console.WriteLine(Wagen.ToString())
  84.         Next
  85.  
  86.         Console.WriteLine("Aantal auto's gelezen met serializer: {0}", wagens_serializer.Count)
  87.         For Each Wagen As Wagen In wagens_serializer
  88.             Console.WriteLine(Wagen.ToString())
  89.         Next
  90.  
  91.         Console.ReadLine()
  92.     End Sub
  93.  
  94. End Module
  95.  


en ter vervollediging XML document
CODE
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <WagenLijst>
  3.   <Wagen ID="1">
  4.     <Merk>Opel</Merk>
  5.     <Model>Corsa</Model>
  6.     <NrPlaat>1-XXX-XXX</NrPlaat>
  7.     <ChassisNr></ChassisNr>
  8.     <Current>1</Current>
  9.   </Wagen>
  10.   <Wagen ID="2">
  11.     <Merk>Opel</Merk>
  12.     <Model>Kombo</Model>
  13.     <NrPlaat>1-XXX-XXX</NrPlaat>
  14.     <ChassisNr></ChassisNr>
  15.     <Current>0</Current>
  16.   </Wagen>
  17.   <Wagen ID="3">
  18.     <Merk>Ford</Merk>
  19.     <Model>Focus</Model>
  20.     <NrPlaat>XXX-XXX</NrPlaat>
  21.     <ChassisNr></ChassisNr>
  22.     <Current>0</Current>
  23.   </Wagen>
  24. </WagenLijst>


en VB klasses
CODE
  1. Imports System.Xml.Serialization
  2.  
  3. <XmlRoot>
  4. Public Class WagenLijst
  5.     <XmlElement("Wagen")>
  6.     Public Wagens As Wagen()
  7. End Class
  8.  
  9. Public Class Wagen
  10.     <XmlAttribute>
  11.     Public ID As Integer
  12.     Public Merk As String
  13.     Public Model As String
  14.     Public ChassisNr As String
  15.     Public NrPlaat As String
  16.     Public Current As Boolean
  17.  
  18.     Public Overrides Function ToString() As String
  19.         Return String.Format("ID: {0} Merk: {1} Model: {2} ChassisNr: {3} NrPlaat: {4} Current: {5}", ID, Merk, Model, ChassisNr, NrPlaat, Current)
  20.     End Function
  21. End Class


en ik laad het hier maar eens op, het projectje (gewoon vb console project)

Bijlage: fbcff592bbf5007d5cbc025835bdd0ce.zip
Deze tekst werd het laatst bewerkt voor 1.98 % door thekid op zondag 15 juni 2014 om 23:22:06.
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #4 geschreven door thekid op dinsdag 17 juni 2014 om 20:54:01.
thekid's avatar
Multiviteit: 5273
Moderator
Geholpen?

Ik had trouwens geen problemen om hem toe te voegen, maar in vb.net moet je misschien eerst de volledige XmlTextReader klasse ingeven, op enter drukken en dan de resolve method hulpfunctie gebruiken (die dan de correcte import toevoegt)
Deze tekst werd het laatst bewerkt voor 15.58 % door thekid op dinsdag 17 juni 2014 om 20:54:28.
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #5 geschreven door Ezio op woensdag 18 juni 2014 om 13:10:30.
Ezio's avatar
Multiviteit: 973
Yep, heeft zeker geholpen, thx!! :D

Vooral dit waren de gouden coderegels:

CODE
  1. Using fs As New FileStream("./WagenLijst.xml", FileMode.Open, FileAccess.Read)


CODE
  1. If (document.NodeType = XmlNodeType.EndElement AndAlso document.Name.Equals("Wagen")) Then



I'm a gamer because I don't have a life... I've chosen to have many
  • Pagina
  • 1 van 1

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen