XML-Knoten aus SQL-Light-Datenbank abfragen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    XML-Knoten aus SQL-Light-Datenbank abfragen

    Hallo VB-Paradise-Community,

    ich habe ein Problem mit einer SQL-Light-Datenbank. In der SQL-Datenbank ist eine Spalte von »Data Type "text"« in welcher XML-Text gespeichert wurde. Nun sollen aus dieser Spalte bestimmte Knoten mittels einer SELECT-Abfrage als Ergebniss abgefragt werden und diese später in einer Data Table gespeichert werden. Wenn ich die Ergebnisse zuerst in die Data Table packe und dann die Knoten herausfiltere dauert es bei großen Mengen ewig... Ich habe schon das halbe Internet durchforstet und mir in diesem Forum dieses Tutorial gefunden ([VB 2008] Sqlite).

    Der XML-Text sieht so aus:

    XML-Quellcode

    1. <Segment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    2. <Elements>
    3. <Text>
    4. <Value>EXAMPLE TEXT 1</Value>
    5. </Text>
    6. <Tag>
    7. <Type>Start</Type>
    8. <Anchor>1</Anchor>
    9. <AlignmentAnchor>1</AlignmentAnchor>
    10. <TagID>309</TagID>
    11. </Tag>
    12. <Tag>
    13. <Type>Standalone</Type>
    14. <Anchor>2</Anchor>
    15. <AlignmentAnchor>2</AlignmentAnchor>
    16. <TagID>310</TagID>
    17. </Tag>
    18. <Text>
    19. <Value>EXAMPLE TEXT 2</Value>
    20. </Text>
    21. <Tag>
    22. <Type>End</Type>
    23. <Anchor>1</Anchor>
    24. <AlignmentAnchor>0</AlignmentAnchor>
    25. <TagID>309</TagID>
    26. </Tag>
    27. <Text>
    28. <Value>EXAMPLE TEXT 3</Value>
    29. </Text>
    30. </Elements>
    31. <CultureName>de-DE</CultureName>
    32. </Segment>


    Als Ergebniss möchte alle <Value>-Knoten hintereinander mittels einer Select-Abfrage erhalten.

    Ich hoffe ich finde hier Hilfe und Ihr wisst was ich meine :D
    Xml-Analysen haben doch nix mit Datenbanken wie SqLite zu tun.
    Da kannstedich mit XmlDocument, XPath-Abfragen, oder seit neuerem mit XDocument auseinandersetzen.

    Zu XPath habich bischen was gemacht, aber die (quasi veraltete XmlDocument-Technologie): XPath-Ausdrücke verwenden

    Oder auch XPathTester

    wird irgendein Xpath wie "Elements/Text/Value" bei rauskommen - aber genau weißich auch nicht mehr.
    Moin moin,

    vielen Dank für deine Antwort. Mittels einer XPath-Abfrage hatte ich es auch schon versucht, leider konnte ich damit nicht alle »Value«-Knoten auslesen sondern immer nur den ersten Knoten. X(

    Das ganze habe ich so gelöst:

    VB.NET-Quellcode

    1. 'XML-Knoten auslesen
    2. Dim XMLdoc As New XmlDocument
    3. For i = 0 To myForm.DataSet1.Tables("XMLSegments").Rows.Count - 1
    4. XMLdoc.LoadXml(myForm.DataSet1.Tables("XMLSegments").Rows(i).Item(2).ToString)
    5. For j = 0 To XMLdoc.SelectNodes("//Text").Count - 1
    6. myForm.DataSet1.Tables("XMLSegments").Rows(i).Item(2) = WebUtility.HtmlDecode(XMLdoc.SelectNodes("//Value").Item(j).InnerXml)
    7. Next (j)
    8. Next (i)


    Zum Auswählen von XML-Knoten habe ich folgendes gefunden:

    SQL-Abfrage

    1. DECLARE @myXml AS XML
    2. SET @myXml =
    3. <ArrayOfProduct>
    4. <Product id="1">
    5. <Description>test1</Description>
    6. </Product>
    7. <Product id="2">
    8. <Description>test2</Description>
    9. </Product>
    10. </ArrayOfProduct>
    11. SELECT
    12. T.c.VALUE(‘@id[1]‘, ‘int’) AS [id]
    13. , T.c.VALUE(‘Description[1]‘, ‘nvarchar(max)’) AS [description]
    14. FROM @myXml.nodes(‘/ArrayOfProduct/Product’) AS T(c)

    Aber ich weiss nicht, wie ich die Ergebnisse meiner Abfrage in die »@myXml«-Variable bekomme und aus dieser dann alle »Value«-Knoten auslesen kann ?(

    Ich werde mir jetzt mal XDocument ansehen... :thumbsup:

    Gelöschter Benutzer schrieb:


    VB.NET-Quellcode

    1. Dim XMLdoc As New XmlDocument
    2. For j = 0 To XMLdoc.SelectNodes("//Text").Count - 1
    3. myForm.DataSet1.Tables("XMLSegments").Rows(i).Item(2) = WebUtility.HtmlDecode(XMLdoc.SelectNodes("//Value").Item(j).InnerXml)
    4. Next (j)

    Dassis ja schon vom Schleifenaufbau her Murx: Zunächst fragst du alle "//Text" ab, aber verwendest vom Ergebnis nur die Anzahl, und zwar als Endwert der Schleife
    In der Schleife fragst du dann jedesmal neu alle "//Value"-Nodes ab - verwendest aber aus der zurückgegebenen Menge nur einen einzigen XmlNode.

    Richtiger Aufbau wäre, die Xpath-Abfrage richtig zu formulieren, und genau einmal abzufragen. Die zurückgegebene XmlNodeCollection dann in einer Schleife durchlaufen und was damit machen - meinetwegen auch in eine DataTable schreiben.

    Wie gesagt: mit XDocument kenne ich mich noch viel weniger aus - ich täte ja erwarten, die biete eine Entsprechung zur Xpath-Abfragesprache, kann aber auch sein, dass XDocument darauf konzipiert ist, mit Linq abgefragt zu werden.
    Jo, mach dich schlau, und lasses uns wissen :thumbsup:
    Da haste Recht! :D
    Dassis ja schon vom Schleifenaufbau her Murx: Zunächst fragst du alle "//Text" ab, aber verwendest vom Ergebnis nur die Anzahl, und zwar als Endwert der Schleife
    In der Schleife fragst du dann jedesmal neu alle "//Value"-Nodes ab - verwendest aber aus der zurückgegebenen Menge nur einen einzigen XmlNode.

    Ich habe eine Lösung gefunden um alle »Value«-Knoten in die Data Table zu packen. Allerdings dauert es bei großen Datenmengen schon etwas länger...
    So funktioniert es erstmal für meine Zwecke:

    VB.NET-Quellcode

    1. myForm.DataSet1.Tables("XMLSegments").Rows(i).Item(2) = String.Empty
    2. For j = 0 To XMLdoc.SelectNodes("//Value").Count - 1
    3. myForm.DataSet1.Tables("XMLSegments").Rows(i).Item(2) += WebUtility.HtmlDecode(XMLdoc.SelectNodes("//Value").Item(j).InnerXml)
    4. Next (j)
    Neinneinnein!

    VB.NET-Quellcode

    1. myForm.DataSet1.Tables("XMLSegments").Rows(i).Item(2) = String.Empty
    2. Dim nodes = XMLdoc.SelectNodes("//Value") 'nur einmal abfragen: die Abfrage gibt alle Treffer in einer Auflistung zurück!!!!
    3. For j = 0 To nodes.Count - 1
    4. myForm.DataSet1.Tables("XMLSegments").Rows(i).Item(2) += WebUtility.HtmlDecode(nodes(j).InnerXml)
    5. Next
    [/quote]
    Neinneinnein!

    VB.NET-Quellcode

    1. myForm.DataSet1.Tables("XMLSegments").Rows(i).Item(2) = String.Empty
    2. Dim nodes = XMLdoc.SelectNodes("//Value") 'nur einmal abfragen: die Abfrage gibt alle Treffer in einer Auflistung zurück!!!!
    3. For j = 0 To nodes.Count - 1
    4. myForm.DataSet1.Tables("XMLSegments").Rows(i).Item(2) += WebUtility.HtmlDecode(nodes(j).InnerXml)
    5. Next



    Jetzt habe ich es auch verstanden! Es muss nicht immer erneut eine Auflistung gemacht werden, vielen Dank für den Hinweis.