PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [VB.net] xml - Getelementbytags



Bl1zz4rD
21.12.2010, 16:19
Hallo,

also ich wollte fragen, wie ich z.B

<waypoint>X=1270.222 Y=1242.654 Z=21</waypoint>
in einer .xml Datei "lesen" kann und es dann so splitten
X
Y
Z

mfg, Bl1zz4rD

krusty
21.12.2010, 16:30
ahhhh shit, verlesen...
ich glaube mit getelementbytagname("waypoint")(0).innertext oder innerxml
sollte es gehen...
Und den Text dann noch richtig aufteilen... hmmm also es gibt sicherlich schönere Möglichkeiten:
dim sInhalt as string = getelementbytagname("waypoint")(0).innertex
dim x as sting
dim y as string
dim z as string

x = split(split(sInhalt,"X=")(1)," ")(0)
y = split(split(sInhalt,"Y=")(1)," ")(0)
z = split(sInhalt,"Z=")(1)

Bl1zz4rD
21.12.2010, 17:02
Funktioniert super, danke :>

/e: Ok ein etwas anderes kleines Problem:
"Es sind mehrere Stammelemente vorhanden. Zeile 2, Position 2."
Also die .xml Datei:
<waypoint>X=2410 Y=200 Z=21</waypoint>
<waypoint>X=1000 Y=000 Z=10</waypoint>

Also bislang sieht das ganze so aus:

Dim aDoc = New XmlDocument()
aDoc.Load("C:\test.xml")
Dim sInhalt As String = aDoc.GetElementsByTagName("waypoint")(0).InnerText
Dim x As String
Dim y As String
Dim z As String

x = Split(Split(sInhalt, "X=")(1), " ")(0)
y = Split(Split(sInhalt, "Y=")(1), " ")(0)
z = Split(sInhalt, "Z=")(1)
MsgBox(x & vbNewLine & y & vbNewLine & z)

BlackHook
21.12.2010, 17:45
Ich würde so oder so die RegEx Variante bevorzugen.
Hier ein Muster für dich.

Mehrere Treffer finden und in der TextBox ausgeben


Dim RegEx_Treffer As New Regex("<waypoint>X=(?<X>(.*)) Y=(?<Y>(.*)) Z=(?<Z>(.*))</waypoint>")
Dim Treffergruppe As MatchCollection
Dim Treffer As Match
Dim ListBox As New ListBox
Dim Zahl As Integer
Try
Treffergruppe = RegEx_Treffer.Matches(RichTextBox1.Text)
For Each Treffer In Treffergruppe
ListBox.Items.Add(Treffer.Groups("X").Value & " " & Treffer.Groups("Y").Value & " " & Treffer.Groups("Z").Value)
Next
For Zahl = 0 To ListBox.Items.Count
TextBox1.Text &= ListBox.Items(Zahl) & vbCrLf
Next
Catch ex As Exception
End TryDas musst du natürlich deinen Bedürfnissen etwas anpassen.

Edit:
Das Teil mit ListBox brauchst gar nicht, das habe ich nur zum testen für mich eingebaut.
So sollte es dann aussehen.

Dim RegEx_Treffer As New Regex("<waypoint>X=(?<X>(.*)) Y=(?<Y>(.*)) Z=(?<Z>(.*))</waypoint>")
Dim Treffergruppe As MatchCollection
Dim Treffer As Match
Try
Treffergruppe = RegEx_Treffer.Matches(RichTextBox1.Text)
For Each Treffer In Treffergruppe
'ERGEBNIS
TextBox1.Text &= Treffer.Groups("X").Value & " " & Treffer.Groups("Y").Value & " " & Treffer.Groups("Z").Value & vbNewLine
'ODER
MsgBox(Treffer.Groups("X").Value & " " & Treffer.Groups("Y").Value & " " & Treffer.Groups("Z").Value & vbNewLine)
Next
Catch ex As Exception
End Try

krusty
21.12.2010, 18:56
GetElementById gibt dir ein Array zurück, du kannst mit einer for each Schleife alle elemente durchlaufen

for each E as xmlelement in getelementbytagname("waypoint") ' ich weiß nicht, ob es xmlelement heißt
dim sInhalt as string = E.innertext()
dim x as string
dim y as string
'den rest kennste ja
next
Damit gehst du jeden einzelnen waypoint durch.

Bl1zz4rD
21.12.2010, 19:26
Ich würde so oder so die RegEx Variante bevorzugen.
Hier ein Muster für dich.

Mehrere Treffer finden und in der TextBox ausgeben


Dim RegEx_Treffer As New Regex("<waypoint>X=(?<X>(.*)) Y=(?<Y>(.*)) Z=(?<Z>(.*))</waypoint>")
Dim Treffergruppe As MatchCollection
Dim Treffer As Match
Dim ListBox As New ListBox
Dim Zahl As Integer
Try
Treffergruppe = RegEx_Treffer.Matches(RichTextBox1.Text)
For Each Treffer In Treffergruppe
ListBox.Items.Add(Treffer.Groups("X").Value & " " & Treffer.Groups("Y").Value & " " & Treffer.Groups("Z").Value)
Next
For Zahl = 0 To ListBox.Items.Count
TextBox1.Text &= ListBox.Items(Zahl) & vbCrLf
Next
Catch ex As Exception
End TryDas musst du natürlich deinen Bedürfnissen etwas anpassen.

Edit:
Das Teil mit ListBox brauchst gar nicht, das habe ich nur zum testen für mich eingebaut.
So sollte es dann aussehen.

Dim RegEx_Treffer As New Regex("<waypoint>X=(?<X>(.*)) Y=(?<Y>(.*)) Z=(?<Z>(.*))</waypoint>")
Dim Treffergruppe As MatchCollection
Dim Treffer As Match
Try
Treffergruppe = RegEx_Treffer.Matches(RichTextBox1.Text)
For Each Treffer In Treffergruppe
'ERGEBNIS
TextBox1.Text &= Treffer.Groups("X").Value & " " & Treffer.Groups("Y").Value & " " & Treffer.Groups("Z").Value & vbNewLine
'ODER
MsgBox(Treffer.Groups("X").Value & " " & Treffer.Groups("Y").Value & " " & Treffer.Groups("Z").Value & vbNewLine)
Next
Catch ex As Exception
End Try

Danke, aber die Methode von krusty ist war nicht die beste, aber auch die leichteste :>.

GetElementById gibt dir ein Array zurück, du kannst mit einer for each Schleife alle elemente durchlaufen

Damit gehst du jeden einzelnen waypoint durch.
Habs nun herausgefunden, das die xml Datei nur
1x
<waypoint>
Inhalt
</waypoint>
beinhalten darf, aber eigentlich will ich
<Profile>
<waypoint>XYZ</waypoint>
<waypoint>XYZ</waypoint>
<waypoint>XYZ</waypoint>
....
</Profile>
Das ganze so haben.