Benutzer mit den meisten Antworten
Anfängerfrage zu LINQ to XML

Frage
-
Hallo,
ich versuche gerade mir LINQ to XML beizubringen, stehe aber auf dem Schlauch. Ich habe folgendes XML-File:
<?xml version="1.0" encoding="utf-8"?> <gtt xmlns="http://www.garmin.com/xmlschemas/GarminTextTranslation/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/GarminTextTranslation/v1 http://www.garmin.com/xmlschemas/GarminTextTranslationv1.xsd"> <hdr> <lang>German</lang> <desc>Deutsch</desc> <type>Primary</type> <sort>0</sort> <cpage>65001</cpage> <pnum>006-D1637-04</pnum> <ver>2.60</ver> <upperkbrd>a</upperkbrd> <lowerkbrd>a</lowerkbrd> <maplang>British English</maplang> <gdnclang>British English</gdnclang> </hdr> <str> <tag>TXT_LANG_ID_STR_M</tag> <txt>Deutsch</txt> </str> <str> <tag>TXT_12_Hour_STR_M</tag> <txt>12Â Stunden</txt> </str> <str> <tag>TXT_15_Seconds_STR_M</tag> <txt>15Â Sekunden</txt> </str> <str> <tag>TXT_1_Minute_STR_M</tag> <txt>1Â Minute</txt> </str> <str> <tag>TXT_1st_STR_M</tag> <txt>1.</txt> </str> </gtt>
Ich habe zwei DataGridView. Die Elemente aus "hdr" sollen mit Name und Wert im ersten DGV und die aus "str" im zweiten DataGridView angezeigt werden. Etwa so:
Name Wert Tag Text
lang German TXT_LANG_ID_STR_M Deutsch
desc Deutsch TXT_12_Hour_STR_M 12 Stunden
Die Tabellen sollen geändert und wieder in ein XML-File gespeichert werden können.
Für die erste Tabelle habe ich keinen blassen Schimmer, wie ich die LINQ-Abfrage gestalten soll. Für die zweite Tabelle habe ich folgende Abfrage, die jedoch nichts zurückgibt:
Dim qList = From itm In xmlDOC.Descendants("str") Select New With {.Tag = itm.Element("tag").Value, .Text = itm.Element("txt").Value} DataGridView1.DataSource = qList.ToList
Wie lautet die erste Abfrage und was ist falsch bei der o.g. Abfrage? Kann mir jemand helfen? Danke!
Gruß LittleBlueBird
Antworten
-
Hallo LittleBlueBird,
Für die zweite Tabelle habe ich folgende Abfrage, die jedoch nichts zurückgibt:
Dim qList = From itm In xmlDOC.Descendants("str") Select New With {.Tag = itm.Element("tag").Value, .Text = itm.Element("txt").Value} DataGridView1.DataSource = qList.ToList
Habe für Dich die zweite Tabelle gemacht mithilfe von LINQ to XML.
Wir haben die folgende XML Eingabedatei (bitte beachte den XML Namespace). Auf der Form habe ich ein Button und ein DataGridView gezogen.
Bearbeite Dich mal ein mit diese zwei Themen: LINQ to XML und XML Namespace.
[XML File]
<?xml version="1.0" encoding="utf-8"?> <gtt xmlns="http://www.garmin.com/xmlschemas/GarminTextTranslation/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/GarminTextTranslation/v1 http://www.garmin.com/xmlschemas/GarminTextTranslationv1.xsd"> <hdr> <lang>German</lang> <desc>Deutsch</desc> <type>Primary</type> <sort>0</sort> <cpage>65001</cpage> <pnum>006-D1637-04</pnum> <ver>2.60</ver> <upperkbrd>a</upperkbrd> <lowerkbrd>a</lowerkbrd> <maplang>British English</maplang> <gdnclang>British English</gdnclang> </hdr> <str> <tag>TXT_LANG_ID_STR_M</tag> <txt>Deutsch</txt> </str> <str> <tag>TXT_12_Hour_STR_M</tag> <txt>12 Stunden</txt> </str> <str> <tag>TXT_15_Seconds_STR_M</tag> <txt>15 Sekunden</txt> </str> <str> <tag>TXT_1_Minute_STR_M</tag> <txt>1 Minute</txt> </str> <str> <tag>TXT_1st_STR_M</tag> <txt>1.</txt> </str> </gtt>
[VB.NET]
Imports <xmlns:ns="http://www.garmin.com/xmlschemas/GarminTextTranslation/v1"> Public Class Form1 Private Function GetGpxDoc(ByVal sFile As String) As XDocument Dim gpxDoc As XDocument = XDocument.Load(sFile) Return gpxDoc End Function Private Function GetGpxNameSpace() As XNamespace Dim gpx As XNamespace = GetXmlNamespace(ns) Return gpx End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim myTest As String = String.Empty myTest = LoadGPX(Application.StartupPath + "\input2.xml") Console.WriteLine(myTest) End Sub Public Function LoadGPX(ByVal sFile As String) As String Dim gpxDoc As XDocument = GetGpxDoc(sFile) Dim gpx As XNamespace = GetGpxNameSpace() Dim _charInfoEl As IEnumerable(Of XElement) = gpxDoc.Descendants(gpx + "str") Dim _charInfo = From item In _charInfoEl _ Select New StrKlasse() With _ { _ .DerTag = item.Element(gpx + "tag").Value, _ .DerText = item.Element(gpx + "txt").Value} DataGridView1.DataSource = _charInfo.ToList() Return "Erfolg!" End Function Public Class StrKlasse Public Property DerTag() As String Get Return m_DerTag End Get Set(ByVal value As String) m_DerTag = value End Set End Property Private m_DerTag As String Public Property DerText() As String Get Return m_DerText End Get Set(ByVal value As String) m_DerText = value End Set End Property Private m_DerText As String End Class End Class
Grüße,
Robert
- Als Antwort markiert LittleBlueBird Freitag, 18. Februar 2011 17:52
-
Hallo Robert
Super, besten Dank! Ich habe mich an folgendes Tutorial gehalten:
und war schon am Verzweifeln, dass es bei mir nicht funktioniert. Ich konnte die Datei einlesen, wenn ich die Attribute hinter gtt entfernt habe. Ich bin jedoch nicht darauf gekommen, dass es am XML Namespace liegen könnte. Dank Deiner Hilfe funktioniert es einwandfrei. Den Header kann ich nun auch einlesen:Dim hdrItems = From item In gpxDoc.Descendants(gpx + "hdr").Elements _ Select New HdrKlasse() With _ {.Name = item.Name.LocalName, _ .Wert = item.Value} Me.DataGridView2.DataSource = hdrItems.ToList()
Danke im Übrigen auch für die Links. Sie sind sehr informativ und helfen mir, LINQ to XML besser zu verstehen.
Gruß LittleBlueBird- Bearbeitet Robert Breitenhofer Dienstag, 1. März 2011 12:00 Formatierung
- Als Antwort markiert Robert Breitenhofer Dienstag, 1. März 2011 12:16
Alle Antworten
-
Hallo LittleBlueBird,
Für die zweite Tabelle habe ich folgende Abfrage, die jedoch nichts zurückgibt:
Dim qList = From itm In xmlDOC.Descendants("str") Select New With {.Tag = itm.Element("tag").Value, .Text = itm.Element("txt").Value} DataGridView1.DataSource = qList.ToList
Habe für Dich die zweite Tabelle gemacht mithilfe von LINQ to XML.
Wir haben die folgende XML Eingabedatei (bitte beachte den XML Namespace). Auf der Form habe ich ein Button und ein DataGridView gezogen.
Bearbeite Dich mal ein mit diese zwei Themen: LINQ to XML und XML Namespace.
[XML File]
<?xml version="1.0" encoding="utf-8"?> <gtt xmlns="http://www.garmin.com/xmlschemas/GarminTextTranslation/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/GarminTextTranslation/v1 http://www.garmin.com/xmlschemas/GarminTextTranslationv1.xsd"> <hdr> <lang>German</lang> <desc>Deutsch</desc> <type>Primary</type> <sort>0</sort> <cpage>65001</cpage> <pnum>006-D1637-04</pnum> <ver>2.60</ver> <upperkbrd>a</upperkbrd> <lowerkbrd>a</lowerkbrd> <maplang>British English</maplang> <gdnclang>British English</gdnclang> </hdr> <str> <tag>TXT_LANG_ID_STR_M</tag> <txt>Deutsch</txt> </str> <str> <tag>TXT_12_Hour_STR_M</tag> <txt>12 Stunden</txt> </str> <str> <tag>TXT_15_Seconds_STR_M</tag> <txt>15 Sekunden</txt> </str> <str> <tag>TXT_1_Minute_STR_M</tag> <txt>1 Minute</txt> </str> <str> <tag>TXT_1st_STR_M</tag> <txt>1.</txt> </str> </gtt>
[VB.NET]
Imports <xmlns:ns="http://www.garmin.com/xmlschemas/GarminTextTranslation/v1"> Public Class Form1 Private Function GetGpxDoc(ByVal sFile As String) As XDocument Dim gpxDoc As XDocument = XDocument.Load(sFile) Return gpxDoc End Function Private Function GetGpxNameSpace() As XNamespace Dim gpx As XNamespace = GetXmlNamespace(ns) Return gpx End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim myTest As String = String.Empty myTest = LoadGPX(Application.StartupPath + "\input2.xml") Console.WriteLine(myTest) End Sub Public Function LoadGPX(ByVal sFile As String) As String Dim gpxDoc As XDocument = GetGpxDoc(sFile) Dim gpx As XNamespace = GetGpxNameSpace() Dim _charInfoEl As IEnumerable(Of XElement) = gpxDoc.Descendants(gpx + "str") Dim _charInfo = From item In _charInfoEl _ Select New StrKlasse() With _ { _ .DerTag = item.Element(gpx + "tag").Value, _ .DerText = item.Element(gpx + "txt").Value} DataGridView1.DataSource = _charInfo.ToList() Return "Erfolg!" End Function Public Class StrKlasse Public Property DerTag() As String Get Return m_DerTag End Get Set(ByVal value As String) m_DerTag = value End Set End Property Private m_DerTag As String Public Property DerText() As String Get Return m_DerText End Get Set(ByVal value As String) m_DerText = value End Set End Property Private m_DerText As String End Class End Class
Grüße,
Robert
- Als Antwort markiert LittleBlueBird Freitag, 18. Februar 2011 17:52
-
Hallo Robert
Super, besten Dank! Ich habe mich an folgendes Tutorial gehalten:
und war schon am Verzweifeln, dass es bei mir nicht funktioniert. Ich konnte die Datei einlesen, wenn ich die Attribute hinter gtt entfernt habe. Ich bin jedoch nicht darauf gekommen, dass es am XML Namespace liegen könnte. Dank Deiner Hilfe funktioniert es einwandfrei. Den Header kann ich nun auch einlesen:Dim hdrItems = From item In gpxDoc.Descendants(gpx + "hdr").Elements _ Select New HdrKlasse() With _ {.Name = item.Name.LocalName, _ .Wert = item.Value} Me.DataGridView2.DataSource = hdrItems.ToList()
Danke im Übrigen auch für die Links. Sie sind sehr informativ und helfen mir, LINQ to XML besser zu verstehen.
Gruß LittleBlueBird- Bearbeitet Robert Breitenhofer Dienstag, 1. März 2011 12:00 Formatierung
- Als Antwort markiert Robert Breitenhofer Dienstag, 1. März 2011 12:16