Jistě jste už někdy uvažovali o tom, jak převést obsah databáze do souboru, který bude obsahovat data ve standardu XML a umožní tak zcela jednoduchou výměnu dat. Tento článek vám poradí, jak na to…

Nebudu se zde zabývat popisem, co to vlastně XML je, neboť vše podstatné bylo řečeno v článku Co je XML?, který zde vyšel asi před rokem a zabývat se v tomto článku popisem struktury XML by určitě bylo nošením dříví do lesa.

Pro realizaci tohoto úkolu budeme potřebovat funkce pro otevření a zavření databáze, které je popsána v článku ASP, databáze a objekt Connection. Data načtená z databáze budeme ukládat do textového souboru pomocí standardních funkcí pro práci s textovými soubory, které byly popisovány v článku Práce se soubory pomocí ASP II.

Při tvorbě kódu budeme počítat s tím, že známe pouze připojovací řetězec do databáze a jméno databázové tabulky. Tento způsob přístupu k řešení k problému nám umožní získat kód, který bude naprosto univerzální pro libovolnou databázovou tabulku bez ohledu na její strukturu.

A nyní k vlastnímu kódu. Nejprve uvedu celý kód, který na závěr postupně vysvětlím:

<!–#include virtual=“/connect.asp“–> <%
on error resume next
if isconnectdb() then
   set fs=server.CreateObject(„scripting.filesystemobject“)
   set fo=fs.createtextfile(server.MapPath(„/clanky“)&“/file.xml“)
   fo.writeline(„<?xml version=““1.0″“ encoding=““windows-1250″“?>“)
   fo.writeline(„<file>“)
   sql=“select * from redaction_anketa_otazky“
   set rs=objconn.execute(sql)
   pocet_sloupcu=rs.fields.count
   do while not rs.eof
      fo.writeline(„<record>“)
      for index=0 to pocet_sloupcu-1
         jmeno_sloupce=rs.fields(index).name
         fo.writeline(„<„&jmeno_sloupce&“>“)
         if rs(jmeno_sloupce)=““ Then
            hodnota=“-„
         else
            hodnota=rs(jmeno_sloupce)&““
         end if
         fo.writeline(hodnota)
         fo.writeline(„</“&jmeno_sloupce&“>“)
      next
      fo.writeline(„</record>“)
      rs.movenext
   loop
   fo.writeline(„</file>“)
   fo.close
   rs.close
   disconnect()
end if
set rs=nothing
set fo=nothing
set fs=nothing
if err.number=0 then
   Response.write(„Vygenerovaný soubor si můžeze stáhnout <a href=““/clanky/file.xml““>zde</a>“)
else
   Response.Write(„Při generování došlo k chybě, soubor není k dispozici“)
end if
%>

V souboru connect.asp, který se do kódu vkládá pomocí directivy INCLUDE, jsou umístněny potřebné funkce pro připojení k databázi. Tyto funkce byly popsány ve článku ASP, databáze a objekt Connection.

A jak to všechno funguje? Po otevření databázové tabulky a textového souboru procházíme pomocí cyklu do while jednotlivými větami databázové tabulky a postupně je zapisujeme do textového souboru.

Pomocí konstrukce počet_sloupcu=rs.fields.count si zjistíme počet sloupců v databázové tabulce. Na základě tohoto zjištěného počtu v cyklu for .. next projdeme jednotlivé položky v řádku tabulky a pomocí konstrukce jmeno_sloupce=rs.fields(index).name si zjistíme jméno sloupce v databázové tabulce. Toto jméno použijeme nejen pro zjištění hodnoty příslušné položky, ale zapíšeme jej jako XML tag do souboru.

Pro ošetření stavu, kdy je položka v databázi prázdná, je zde určena podmínka, která zajistí její naplnění vložením znaku „-„. Po ukončení práce v cyklu do while provedeme zavření textového souboru, recordset a spojení na databázi. Nakonec prověříme, zda-li během konverze nedošlo k nějaké chybě. V případě bezchybného průběhu nabídneme soubor ke stažení a v opačném případě ohlásíme chybu.

Pokud budete mít zájem o pokračování článku, a to sice, jak zpracovat XML dokument pomocí ASP, napište mi na můj email nebo do diskuse pod článkem.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

2 Příspěvků v diskuzi

  1. Já bych šel spíš konstrukcí


    For Each polozka In rs.Fields
    Response.write „“ & polozka & „“
    Next

Odpovědět