Wpis z mikrobloga

Mirki,
Próbuje wygenerować XML z zapytań sql. Obecnie mam trzy zapytania
1 select * from produkty -> ( id, kod, nazwa_produktu )
2 select * from kategorie -> (id, nazwa_kategorii )
3 select * from zdjecia -> (id, linkdozdjecia )

XML jakiego chce wygenerować

<produkty>
<produkt>
<kod>TowarA</kod>
<nazwa>NazwatowaruA</nazwa>
<kategoriie>
<kategoria>Kat_1</kategoria>
<kategoria>Kat_3</kategoria>
</kategorie>
<zdjecia>
<zdjecie>ZdjecieTowaruA_1</zdjecie>
<zdjecie>ZdjecieTowaruA_2</zdjecie>
</zdjecia>
</produkt>
<produkt>
<kod>TowarB</kod>
<nazwa>NazwatowaruB</nazwa>
<kategoriie>
<kategoria>Kat_3</kategoria>
<kategoria>Kat_6</kategoria>
<kategoria>Kat_8</kategoria>
</kategorie>
<zdjecia>
<zdjecie>ZdjecieTowaruB_1</zdjecie>
</zdjecia>
</produkt>
<produkt>
<kod>TowarC</kod>
<nazwa>NazwatowaruC</nazwa>
<kategoriie>
<kategoria>Kat_3</kategoria>
</kategorie>
<zdjecia>
<zdjecie>ZdjecieTowaruC_1</zdjecie>
<zdjecie>ZdjecieTowaruC_2</zdjecie>
<zdjecie>ZdjecieTowaruC_3</zdjecie>
</zdjecia>
</produkt>
</produkty>

Próbowałem to zrobić powershellem, i wszystko był ok, do momenty gdy musiałem zagnieździć dane, musiałem skorzystać z więcej niż jednego zapytania.

Próbka mojego skryptu, który generuje bzdury

$query = "select * from produkty"
$query_kat = "select * from kategorie"
$query_img = "select * from zdjęcia"

$xmlWriter.Formatting = 'Indented'
$xmlWriter.Indentation = 1
$XmlWriter.IndentChar = "
t"

[array]$items = Invoke-Sqlcmd -ServerInstance $server -Database $database
-Username $username -Password $password -Query $query -ErrorAction Stop
[array]$items_kat = Invoke-Sqlcmd -ServerInstance $server -Database $database

-Username $username -Password $password -Query $queryimg -ErrorAction Stop
[array]$itemsurl = Invoke-Sqlcmd -ServerInstance $server -Database $database
-Username $username -Password $password -Query $query_img -ErrorAction Stop
$xmlWriter.WriteStartDocument()
$xmlWriter.WriteStartElement('Produkty')
foreach ($item in $items)
{
$xmlWriter.WriteStartElement('Produkt')
$xmlWriter.WriteElementString('kod', $item.kod)
$xmlWriter.WriteElementString('nazwa', $item.nazwa_produktu )

$xmlWriter.WriteStartElement('kategoriie')
foreach($a in $items_kat)
{
$xmlWriter.WriteElementString('kategoria', $a.nazwa_kategorii)
}
$xmlWriter.WriteEndElement()

$xmlWriter.WriteStartElement('zdjecia')
foreach($a in $items_url)
{
$xmlWriter.WriteElementString('zdjecie', $a.link_do_zdjecia)
}
$xmlWriter.WriteEndElement()
$xmlWriter.WriteEndElement()
}
$xmlWriter.WriteEndDocument()

Próbowałem też sql. Tu znów nie zamykało mi poprawnie tagów...

SELECT
      COALESCE(p.kod, '') AS kod,
      COALESCE(p.nazwa, '') AS nazwa,

 (select
      COALESCE(k.nazwa_kategorii,' ') as [kategoria]
      FROM kategorie as k
      where p.id = k.id
      FOR XML PATH('kategoria'), ROOT('kategoriie'), TYPE),

      (select
       COALESCE(z.link_do_zdjecia,'') as [link_do_zdjecia]
       FROM zdjecia as z
       where p.id = z.id
      FOR XML PATH('link_do_zdjeca'), ROOT('link_do_zdjec'), TYPE)

FROM produkty as p
FOR XML PATH('produkt'), ROOT('produkty')

Gdzie robię błąd ?
#sql #powershell #xml #programowanie
  • 8
@biju:
Można wygenerować XML z tych zapytań SQL przy użyciu języków takich jak PHP, Python, Java itp. Zależy to od Twojego doświadczenia i jakiej technologii używasz.

W przypadku PHP, możesz użyć biblioteki PDO do wykonania zapytań SQL i następnie stworzyć XML za pomocą funkcji DOM.

Poniższy przykład pokazuje, jak można to zrobić za pomocą PHP:
<?php

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "databasename";

try {
Próbuje wygenerować XML z zapytań sql. Obecnie mam trzy zapytania
1 select * from produkty -> ( id, kod, nazwa_produktu )
2 select * from kategorie -> (id, nazwa_kategorii )
3 select * from zdjecia -> (id, linkdozdjecia )

Można wygenerować XML z tych zapytań SQL przy użyciu języków takich jak PHP, Python, Java itp. Zależy to od Twojego doświadczenia i jakiej technologii używasz.

W przypadku PHP, możesz użyć biblioteki PDO do
@biju: pobaw się ChatemGPT, myślę, że uda się wygenerować coś sensownego. Co do pomocy to raczej mało ludzi tutaj umie Powershella w takim stopniu, żeby ci coś wskazać (no i wklej kod po ludzku)
@Saly: bawiłem się, ale i najlepsze co wygenerował to sql z CTE i FOR XML , ale też nie było tagów zamykających w zagnieżdżeniach np przy zdjęciach
@divit0n: Wygląda analogicznie jak moje podejść w PowerShellu, do momentu jak nie mam zagnieżdżeń jest ok. Tylko jak to teraz zrobić gdy np dla jednego produktu mam kilka zdjęć. tzn chce uzyskać takie coś:

<produkty>
<produkt>
<kod>TowarA</kod>
<nazwa>NazwatowaruA</nazwa>
<kategoriie>
<kategoria>Kat_1</kategoria>
<kategoria>Kat_3</kategoria>
</kategorie>
<zdjecia>
<zdjecie>ZdjecieTowaruA_1</zdjecie>
<zdjecie>ZdjecieTowaruA_2</zdjecie>
</zdjecia>
</produkt>
</produkty>
@biju: Ciężko powiedzieć, nie znając zbyt wiele szczegółów, ale tak na szybko to może wyglądać tak:

$items = Invoke-Sqlcmd -ServerInstance $server -Database $database -Username $username -Password $password -Query $query
$items_kat = Invoke-Sqlcmd -ServerInstance $server -Database $database -Username $username -Password $password -Query $queryimg
$items_url = Invoke-Sqlcmd -ServerInstance $server -Database $database -Username $username -Password $password -Query $query_img

$produkty = @()

foreach ($item in $items){
$item_kat = $items_kat | ? {$_.id -eq $item.id}
$item_url