Announcement

Collapse
No announcement yet.

XML Datei lesen -> mit LINQ Teile abfragen -> neue XML Datei erzeugen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML Datei lesen -> mit LINQ Teile abfragen -> neue XML Datei erzeugen

    Hallo miteinander!

    Ich bin neu hier und habe folgendes Problem:

    Ich möchte eine vorhandene XML Datei öffnen, dann bestimmte Daten auslesen und die ausgelesenen Daten wieder in eine neue XML Datei schreiben.
    Wie wäre hier die Vorgehensweise?

    Die XML Datei hat in etwa folgenden Aufbau:

    <?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
    <preisliste>
    <bauteil>
    <bauteil_nummer>123</bauteil_nummer>
    <bauteil_beschreibung>
    <beschreibung1>Neues Bauteil abc</beschreibung1>
    <beschreibung2>Hat diese Eigenschaften</beschreibung2>
    </bauteil_beschreibung>
    <bauteil_gruppe>Gruppe1 blabla</bauteil_gruppe>
    </bauteil>
    <bauteil>
    ...
    </preisliste>

    Jetzt soll nach der "bauteil_gruppe" gesucht werden und alle Teile, welche zu einer Gruppe gehören, sollen in eine neue XML Datei geschrieben werden.

    Leider bin ich bisher selbst mit der Abfrage noch nicht so recht vorwärts gekommen:

    Code:
    Dim XMLdoc As XDocument = XDocument.Load(strXMLFilePath)
    
    Dim qList = From xe In XMLdoc.Descendants.Elements.<bauteil> _
                        Where xe.<bauteil_gruppe>.Value Like "Gruppe1*" _
                        Select New With { _
                                        .ID = xe.<bauteil_nummer>.Value _
                                       '...
                                        }

    Was genau macht eigentlich das "New" in "[...]Select New With [...]"
    Bezieht sich das "With" inkl. dem "."-Operator auf "qList" oder auf "xe"?

    Wäre über jegliche Hilfe sehr dankbar!

    Grüße, Sebastian

  • #2
    Hallo nochmal!

    Ich habe das Auslesen mittlerweile hinbekommen.

    Nun habe ich folgende Funktion in einer extra Klasse:

    [highlight=vb.net]
    Public Class XMLdb
    ' Eigenschaften
    Dim XMLfile As XElement

    ' Konstruktor
    Sub New(ByRef strXMLFilePath As String)
    ' XDocument erstellen und die XML Datei hineinladen
    Me.XMLfile = XElement.Load(strXMLFilePath)
    End Sub

    'Methoden
    Public Function GetXMLData(ByRef grid As DataGridView) As Object
    Dim result = From item In XMLfile.Elements("bauteil") _
    Where item.Element("bauteil_gruppe").Value Like "Gruppe1*" _
    Select New With { _
    .no = item.<bauteil_nummer>.Value, _
    .gruppe = item.<bauteil_gruppe>.Value _
    '...
    }

    grid.DataSource = result.ToList
    Return result
    End Function
    End Class
    [/highlight]

    Ein Aufruf erfolgt so:
    [highlight=vb.net]
    Dim XMLdbFile As New XMLdb(ofdXML.FileName) 'ofdXML.FileName kommt aus einem "OpenFileDialog"
    Dim xmlresult = XMLdbFile.GetXMLData(Me.DataGridView1)
    [/highlight]

    Nun möchte ich aber als Returnwert der Funktion nich Object haben, sondern den Typ, den result in Wirklichkeit besitzt.
    Damit ich an dem Ort, an dem der Aufruf erfolgt Me.DataGridView1.DataSource = xmlresult.ToList schreiben kann.

    Der Referenzparameter soll also eigentlich nicht verwendet werden!

    Ich hoffe, es ist einigermaßen verständlich und mir kann jemand weiterhelfen!

    -----------------------

    Muss ich dann beim Erstellen einer neuen XML Datei meine "result Collection" aus der Funktion "händisch" (for each z.B.) durchlaufen und mit einem XmlWriter (>>in der Art??<<) eine neue XML Datei erzeugen?

    Grüße, Sebastian

    Comment


    • #3
      Hallo,

      kann der Rückgabetyp der Methode nicht auf XElement (so heißt es in C#, wie es in VB.net heitß weiß ich nicht) gesetzt werden?


      mfG Gü
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4
        Ich kann das ganze wie folgt ändern:

        [highlight=vb.net]
        Public Function GetXMLData(ByRef grid As DataGridView) As XElement

        Dim result As XElement = CType(From item In XMLfile.Elements("bauteil") _

        Where item.Element("bauteil_gruppe").Value Like "Gruppe1*" _

        Select New With { _

        .no = item.<bauteil_nummer>.Value, _

        .gruppe = item.<bauteil_gruppe>.Value _

        '...

        }, XElement)


        Return result

        End Function
        [/highlight]

        Dann bekomme ich aber die 2 folgenden Fehler:

        "Fehler 1 Syntaxfehler in Umwandlungsoperator; zwei durch Komma getrennte Argumente sind erforderlich." (Zeile 15)

        "Fehler 2 Der Name "result" wurde nicht deklariert." (Zeile 18)

        ???

        Comment


        • #5
          Hm...wenn ich es wie folgt mache, funktioniert zwar die Konvertierung mit CType, aber das ganze bringt mir nichts, da ich es nicht mit DataGridView1.ToList ins DataGridView bringe. Denn es gibt dann nur noch die .ToString Methode.

          [highlight=vb.net]

          Public Function GetXMLData(ByRef grid As DataGridView) As XElement



          Dim result = From item In XMLfile.Elements("bauteil") _



          Where item.Element("bauteil_gruppe").Value Like "Gruppe1*" _



          Select New With { _



          .no = item.<bauteil_nummer>.Value, _



          .gruppe = item.<bauteil_gruppe>.Value _



          '...



          }


          Dim result2 As XElement = CType(result, XElement)


          Return result2



          End Function
          [/highlight]

          result ist vom Typ: System.Collections.Generic.IEnumerable(Of <anonymer Typ>)

          result2 ist vom Typ: System.Xml.Linq.XElement

          Das ganze bringt mich also leider nicht weiter...

          Noch mehr Ideen?

          Comment

          Working...
          X