Daten aus XML Datei auslesen
Hallo zusammen,
ich habe eine Aufgabe, die Datein aus XML in eine Tabelle einzulesen.
die XML Datei habe ich schon zu SQL Server Management imortiert. Jetzt muss ich die DAten auselsen, aber leider passiert nicht viel.
Die XML Datei im grob sieht so aus:
[code]
<record type="Authority">
<leader>00000nz a2200000nc 4500</leader>
<controlfield tag="001">1011387409</controlfield>
<controlfield tag="003">DE-101</controlfield>
<controlfield tag="005">20150227101359.0</controlfield>
<controlfield tag="008">110430n</controlfield>
<datafield tag="024" ind1="7" ind2=" ">
<subfield code="a">http://d-nb.info/brd/123</subfield>
<subfield code="2">uri</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(DE-101)105f563</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(DE-588)632a452</subfield>
</datafield>
</record>
[/code]
Ich frage die xml so ab:
[code]
select
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:leader[1]','varchar(255)') leader,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:controlfield[1]','varchar(255)') controlfield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/@tag','varchar(255)') datafield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/marc21:subfield[1]','varchar(255)') subfield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[2]/@tag','varchar(255)') datafield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[2]/marc21:subfield[1]','varchar(255)') subfield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[3]/@tag','varchar(255)') datafield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[3]/marc21:subfield[1]','varchar(255)') subfield,
FROM (
--Abfrage auf Import-Tabelle
Select Top 1 xmlData
FROM dbo.orgaImportHistory
--order by loadedDateTime desc
) xml
cross apply xml.xmlData.nodes('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:collection/marc21:record') as orga(ref)
--cross apply orga.ref.nodes('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:collection/marc21:record/datafield[@tag="110"]')
[/code]
und als Ergebnis bekomme ich leader, controlfield und datafield 1, datafield 2, datafield 3.
Nun wenn ein Datensatz mehr als 4 Datafields hat, sehe ich das nicht. Da die Datei sehr groß ist, möchte ich fragen: wie kann ich so auslesen, dass die Abfrage gib mir einfach zu jede controlfield alle datafileds. Es bedeutet 1 Datensatz wird 3 Datafields haben, ein andere 5 Datafileds.
Könnnte man das irgendwie vereinfachen?
Falls ich im falschen Forum bin, bitte mitteilen!
Viele Grüße aus Ulm!
ich habe eine Aufgabe, die Datein aus XML in eine Tabelle einzulesen.
die XML Datei habe ich schon zu SQL Server Management imortiert. Jetzt muss ich die DAten auselsen, aber leider passiert nicht viel.
Die XML Datei im grob sieht so aus:
[code]
<record type="Authority">
<leader>00000nz a2200000nc 4500</leader>
<controlfield tag="001">1011387409</controlfield>
<controlfield tag="003">DE-101</controlfield>
<controlfield tag="005">20150227101359.0</controlfield>
<controlfield tag="008">110430n</controlfield>
<datafield tag="024" ind1="7" ind2=" ">
<subfield code="a">http://d-nb.info/brd/123</subfield>
<subfield code="2">uri</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(DE-101)105f563</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(DE-588)632a452</subfield>
</datafield>
</record>
[/code]
Ich frage die xml so ab:
[code]
select
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:leader[1]','varchar(255)') leader,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:controlfield[1]','varchar(255)') controlfield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/@tag','varchar(255)') datafield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/marc21:subfield[1]','varchar(255)') subfield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[2]/@tag','varchar(255)') datafield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[2]/marc21:subfield[1]','varchar(255)') subfield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[3]/@tag','varchar(255)') datafield,
orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[3]/marc21:subfield[1]','varchar(255)') subfield,
FROM (
--Abfrage auf Import-Tabelle
Select Top 1 xmlData
FROM dbo.orgaImportHistory
--order by loadedDateTime desc
) xml
cross apply xml.xmlData.nodes('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:collection/marc21:record') as orga(ref)
--cross apply orga.ref.nodes('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:collection/marc21:record/datafield[@tag="110"]')
[/code]
und als Ergebnis bekomme ich leader, controlfield und datafield 1, datafield 2, datafield 3.
Nun wenn ein Datensatz mehr als 4 Datafields hat, sehe ich das nicht. Da die Datei sehr groß ist, möchte ich fragen: wie kann ich so auslesen, dass die Abfrage gib mir einfach zu jede controlfield alle datafileds. Es bedeutet 1 Datensatz wird 3 Datafields haben, ein andere 5 Datafileds.
Könnnte man das irgendwie vereinfachen?
Falls ich im falschen Forum bin, bitte mitteilen!
Viele Grüße aus Ulm!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 449873
Url: https://administrator.de/contentid/449873
Ausgedruckt am: 25.11.2024 um 21:11 Uhr
2 Kommentare
Neuester Kommentar
Ich habe auch so ein bastel-Projekt mit XML in SQL grade. Bisher war die Ausgangsstruktur nicht so flexibel das ich eine variable Anzahl an Elementen hatte aber auf die schnelle habe ich das hier gefunden:
https://stackoverflow.com/questions/19025118/how-to-retrieve-all-child-e ...
https://stackoverflow.com/questions/19025118/how-to-retrieve-all-child-e ...