none
Anfängerfrage zu LINQ to XML RRS feed

  • 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
    Mittwoch, 16. Februar 2011 21:51

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

    Freitag, 18. Februar 2011 08:58
  • 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
    Freitag, 18. Februar 2011 17:51

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

    Freitag, 18. Februar 2011 08:58
  • 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
    Freitag, 18. Februar 2011 17:51