none
XML abfragen RRS feed

  • Frage

  • Hallo,

    ich starte gerade ein neues Projekt in dem ich auf dem Fileserver nach bestimmten Arbeitsdateien suche die nichts anderes sind wie umbenannte ZIP-Files. Innerhalb dieser Files sind 1 bis 5 XML-Dateien vorhanden, die ich für eine weitere Auswertung sammeln möchte.

    Das Projekt erstelle ich mit VB.net, damit suche ich die Dateien und öffne diese um an die XML-Dateien zu kommen.

    Jetzt würde ich gerne alle Infomationen wie Dateiname, Pfad, Datum etc in eine Tabelle auf dem SQL-Server ablegen, was soweit ja kein Problem ist. In einer weiteren Tabelle würde ich nun gerne die XML-Dateien ablegen, dazu definiere ich ein Feld als XML.

    Da es 1 bis 5 Dateien geben wird, werde ich in der ersten Tabelle die Angaben zu den ZIP-Dateien abelegen und eine GUID als Schlüssel erzeugen, diesen verwende ich dann für die XML-Dateien in der zweiten Tabelle um hier die Verknüpfung zur Datei zu haben.

    Da ich noch nicht weiss welche Angaben später benötigt werden, würde ich gerne die im Feld abgelegten XML-Dateien auslesen und auf TAGS in der XML-Datei zugreiffen.

    Meine Frage lautet nun, wie kann man das machen?

    Beispiel:

    <set>
      <user>
        <name = "Testuser" />
        <building= "Block A" />
      </user>
    </set>

    Angenommen ich suche jetzt alle XML-Dateien der zweiten Tabelle bei denen im XML-Feld eine Datei existiert die im Inhalt bei "building" = "Block A" hat, geht das?

    Ich muss leider so fragen da SQL nicht ganz meine Domäne ist und nicht weiss ob die Vorgehensweise do überhaupt passt.

    Wenn es klappt, dann könnte ich bei ersten Programm-Lauf bereits Auswertungen machen und wenn notwendig auch anpassen.

    Viele Grüsse,
    Maximilian

    Sonntag, 18. November 2012 12:47

Antworten

  • Hallo Maximilian,

    so ganz gültig ist den XML nicht gerade, Du kannst einem Element wie "Building" nicht einen Wert zuweisen. Wenn Du das aber korrigiert hast, kannst Du es mit XQuery Abfragen, z.B.

    DECLARE @xml XML;
    SET @xml =
    '<set>
      <user>
        <name value="Testuser" />
        <building value="Block A" />
      </user>
    </set>'
    
    SELECT nodes.rows.value('@value' , 'varchar(100)') AS Building
    FROM  @xml.nodes('/set/user/building') AS nodes(rows) 


    Olaf Helper

    Blog Xing

    Montag, 19. November 2012 09:13
  • Hallo Maximilian,

    natürlich geht das auch mit Daten in einer Tabelle mit dem Datentyp XML. Hier kannst Du sogar noch einen speziellen XML Index anlegen, um Abfragen zu beschleunigen.

    Hier ein ganz einfaches Beispiel:

    CREATE TABLE #test (daten xml);
    INSERT INTO #test VALUES(
    '<set><user>
        <name value="Testuser" />
        <building value="Block A" />
      </user></set>'
    );
    INSERT INTO #test VALUES(
    '<set><user>
        <name value="Testuser" />
        <building value="Block BB" />
      </user></set>'
    )
    
    SELECT T.*
         ,nodes.rows.value('@value' , 'varchar(100)') AS Building
    FROM #test AS T
         CROSS APPLY T.daten.nodes('/set/user/building') AS nodes(rows)
    WHERE nodes.rows.value('@value' , 'varchar(100)') = 'Block A'
    
    GO
    DROP TABLE #test;

    Mit XQuery kann man die Abfragen auch noch anders gestalten

    SELECT T.*
    FROM   #test AS T
    WHERE  T.daten.exist ('/set/user/building/@value[.="Block A"]') = 1


    Olaf Helper

    Blog Xing


    Donnerstag, 22. November 2012 14:20

Alle Antworten

  • Hallo Maximilian,

    so ganz gültig ist den XML nicht gerade, Du kannst einem Element wie "Building" nicht einen Wert zuweisen. Wenn Du das aber korrigiert hast, kannst Du es mit XQuery Abfragen, z.B.

    DECLARE @xml XML;
    SET @xml =
    '<set>
      <user>
        <name value="Testuser" />
        <building value="Block A" />
      </user>
    </set>'
    
    SELECT nodes.rows.value('@value' , 'varchar(100)') AS Building
    FROM  @xml.nodes('/set/user/building') AS nodes(rows) 


    Olaf Helper

    Blog Xing

    Montag, 19. November 2012 09:13
  • Hallo Olaf,

    vielen Dank für die Antwort.

    Das Ganze geht dann auch wenn ich in meiner Tabelle ein Feld als XML anlege, im Tool (was ich noch schreiben muss) der Tabelle jeweils ein Datensatz hinzufüge in dem im Feld der Inhalt der Datei ist?

    Der Hintergedanke ist das ich diese Dateien auslese und den Inhalt der Tabelle hinzufüge. Damit muss ich ein FileScan durchführen, lade den Inhalt in die Datenbank und kann später bei geänderten Anforderungen Selects auf die Daten ausführen.

    Das wäre die Möglichkeit die ich suche.

    Viele Grüsse,
    Maximilian

    Donnerstag, 22. November 2012 13:48
  • Hallo Maximilian,

    natürlich geht das auch mit Daten in einer Tabelle mit dem Datentyp XML. Hier kannst Du sogar noch einen speziellen XML Index anlegen, um Abfragen zu beschleunigen.

    Hier ein ganz einfaches Beispiel:

    CREATE TABLE #test (daten xml);
    INSERT INTO #test VALUES(
    '<set><user>
        <name value="Testuser" />
        <building value="Block A" />
      </user></set>'
    );
    INSERT INTO #test VALUES(
    '<set><user>
        <name value="Testuser" />
        <building value="Block BB" />
      </user></set>'
    )
    
    SELECT T.*
         ,nodes.rows.value('@value' , 'varchar(100)') AS Building
    FROM #test AS T
         CROSS APPLY T.daten.nodes('/set/user/building') AS nodes(rows)
    WHERE nodes.rows.value('@value' , 'varchar(100)') = 'Block A'
    
    GO
    DROP TABLE #test;

    Mit XQuery kann man die Abfragen auch noch anders gestalten

    SELECT T.*
    FROM   #test AS T
    WHERE  T.daten.exist ('/set/user/building/@value[.="Block A"]') = 1


    Olaf Helper

    Blog Xing


    Donnerstag, 22. November 2012 14:20
  • Hallo MaxiTesch,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 5. Dezember 2012 12:50
    Moderator