Mnogi programerji Delphi povezujejo shranjevanje nastavitev z uporabo INI datoteke v vaših programih. Aplikacija ta metoda, pri bolj ali manj resnih projektih, se je treba izogibati, saj omejuje fleksibilnost, kar onemogoča nadaljnjo širitev programa. Vredno je povedati, da je ta pristop precej priljubljen zaradi enostavnosti uporabe in razpoložljivosti vgrajenih orodij v razvojnem okolju.
Vendar je idealna možnost za shranjevanje programskih nastavitev strukturirana XML datoteke. Njihova prednost je, da število parametrov ni mogoče določiti. Da bi to bolje razumeli, si oglejmo konkreten primer.
V programu USearch se ob kliku na vnos pojavi kontekstni meni, ki prikaže seznam elementov. Ti elementi so ukazi, ki se nato naložijo iz nastavitvene datoteke. Če so bile nastavitve shranjene v INI datoteko, potem lahko program shrani in naloži določeno število ukazov, na primer 10 ali 50. Takoj ko bo potrebna večja vrednost, bo treba kodo prepisati in ustrezno znova prevesti.
Uporaba pristopa z uporabo XML datotek, bomo lahko dinamično naložili vse parametre razdelka. Poleg vsega tega bo konfiguracijska datoteka postala elegantnejša, brez odvečnega oštevilčenja parametrov. vendar standardna sredstva delati z XML Delphi ima veliko pomanjkljivosti, zato priporočam uporabo standardne knjižnice MSXML. Običajno je privzeto vključen operacijski sistemi Družina Windows.
Povezati MSXML, moramo ustvariti vmesniško datoteko s seznamom vseh funkcij in jo uvoziti s strežnika COM. Precej je bilo napisanega o tem, kako uvoziti vmesnik. podrobni članki, predlagam, da prenesete datoteko MSXML2_TLB.PASže pripravljen za uporabo. Ko je datoteka prenesena, jo postavite poleg svojega projekta ali jo spustite v mapo lib okolja Delphi. Tako bodo vsi ustvarjeni programi lahko uporabljali modul MSXML, preprosto morate dodati vrstico MSXML2_TLB v uses.
Zaradi jasnosti si oglejte naslednji primer uporabe te knjižnice:
Procedure LoadData; var XMLDoc: DOMDocument; Koren: IXMLDOMElement; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("size/width").Text); Koren:= nič; XMLDoc:= nič; konec;
Najprej se ustvari primerek razreda DOMDocument, nato pa se vsebina datoteke settings.xml naloži v pomnilnik. Ker po standardu koli XML datoteka mora vsebovati korensko oznako (v tem primeru konfiguracija), potem ga moramo pridobiti s funkcijo DocumentElement. Nato se prikaže vsebina med oznakama
Tukaj je uporabljena metoda SelectSingleNode, ki za parameter vzame niz
Kljub dejstvu, da je bila tema dela z XML v Delphiju precej razpravljana na internetu, se vprašanja o tej temi pogosto pojavljajo na različnih forumih.
Tudi o tem sem že pisal, vendar bi se rad vrnil k resničnemu primeru hitre analize datoteko XML in pridobivanje podatkov, ki sem ga danes opravil v službi. Za pridobitev potrebnih podatkov nisem potreboval več kot 5 minut.
Ozadje. Danes smo morali obdelati podatke o nameščenih programov na računalnikih uporabnikov (ja, ja, odkrivamo pirate :)). Tehnični oddelek mi je posredoval te informacije, odvzete od nič hudega slutečih uporabnikov prek omrežja z WMI. Program, ki so ga uporabili, izdeluje poročila v formatu XML. Temu primerno so mi prinesli goro datotek XML s precej zapleteno strukturo, iz katere sem moral samo izluščiti imena nameščenih programskih izdelkov. Zdravljenje. Ko sem ročno pregledal nekaj datotek, sem ugotovil, da ne bo trajalo dolgo, da bi se postaral, in se odločil napisati majhen pretvornik. Ko sem zagnal Delphi, sem v repozitoriju izbral objekt XML DataBinding in mu dodal eno od datotek. Vse nastavitve in parametre sem pustil privzeto in posledično sem ustvaril modul z velikim številom razredov in vmesnikov za dostop do elementov te datoteke XML. Nisem porabil veliko časa za ugotavljanje strukture razreda in sem takoj prešel na pisanje pretvornika. V novi konzolni aplikaciji sem napisal precej preprosto kodo:
program XML2TXT;
uporablja
Obrazci
Razredi, SysUtils,
SoftwareXML v "SoftwareXML.pas";
postopek CovertXML2Text;
var
softbase: IXMLSTDSoftwareType;
i:celo število;
sr: TSearchRec;
CurDir: niz;
ExportFile: TStringList;
začeti
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
če je FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0, potem
ponovite
ExportFile:= TStringList.Create;
softbase:= LoadSTDSoftware(Pchar(CurDir+sr.Name));
for i:= 0 do softbase.InstalledSoftware.source.software.Count - 1 do
ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);
ExportFile.Sort;
ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+".txt");
ExportFile.Free;
dokler FindNext(sr) 0;
konec;
začeti
Application.Initialize;
CovertXML2Text;
konec.
Posledično sem imel za vsak računalnik v omrežju eno besedilno datoteko, ki je vsebovala seznam nameščene programske opreme.
Zdi se mi, da ta koda zahteva nekaj razlage. Zakaj sem na primer uporabil modul Forms v konzolni aplikaciji in poklical proceduro Application.Initialize;?
Pravzaprav je preprosto – gre za majhen vdor, ki vam omogoča uporabo XML Data Binding v konzolni aplikaciji. Ker trmasto ni hotel inicializirati razreda za delo z XML. Nisem še ugotovil pravih razlogov - čas je bil danes pomemben, 4 od 5 minut sem že porabil za boj proti tej napaki. :) Mislim, da se bom kasneje ukvarjal s tem problemom in napisal kaj je pravi razlog.
Nenavaden razred softbase je bil ustvarjen na Temelji na XML datoteka - to je bilo ime korenskega elementa, in softbase.InstalledSoftware.source.software[i].DisplayName - preprosto se pomaknite med ugnezdenimi elementi do želenega in pridobite njegovo vrednost.
Tako je pravzaprav videti eden najbolj hitre načine delo z XML v Delphiju.
XML se vse bolj uporablja za shranjevanje informacij in njihovo izmenjavo med aplikacijami in spletnimi mesti. Številne aplikacije uporabljajo ta jezik kot osnovni jezik za shranjevanje podatkov, medtem ko ga druge uporabljajo za izvoz in uvoz podatkov XML. To pomeni, da je čas, da razvijalci razmislijo o tem, kako lahko uporabljajo podatke XML v svojih aplikacijah.
V tem članku si bomo ogledali XML Document Object Model (DOM) in njegovo izvedbo s strani Microsofta - Microsoft XML DOM.
XML DOM je objektni model, ki razvijalcu nudi objekte za nalaganje in obdelavo datotek XML. Objektni model sestavljajo naslednji glavni objekti: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap in XMLDOMParseError. Vsak od teh objektov (razen XMLDOMParseError) vsebuje lastnosti in metode, ki vam omogočajo, da pridobite informacije o objektu, manipulirate z vrednostmi in strukturo predmeta ter krmarite po strukturi dokumenta XML.
Oglejmo si glavne objekte XML DOM in navedimo nekaj primerov njihove uporabe v Borland Delphi.
Uporaba XML DOM v Borland Delphi
Če želite uporabljati Microsoft XML DOM v aplikacijah Delphi, morate s projektom povezati ustrezno knjižnico tipov. Za to izvedemo ukaz Projekt | Import Type Library in v pogovornem oknu Import Type Library izberite knjižnico Microsoft XML različice 2.0 (različica 2.0), ki se običajno nahaja v datoteki Windows\System\MSXML.DLL
Po kliku na gumb Ustvari enoto se ustvari vmesniški modul MSXML_TLB, ki nam bo omogočil uporabo objektov XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest in še vrsto drugih implementiranih v knjižnici MSXML.DLL. Sklic na modul MSXML_TLB mora biti naveden na seznamu Uporabe.
Naprava XML DOM
Objektni model dokumenta predstavlja dokument XML kot drevesno strukturo, sestavljeno iz vej. Programski vmesniki XML DOM omogočajo aplikacijam krmarjenje po drevesu dokumenta in manipuliranje z njegovimi vejami. Vsaka veja ima lahko določen tip (DOMNodeType), glede na katerega se določita nadrejena in podrejena veja. V večini dokumentov XML boste našli veje, kot so element, atribut in besedilo. Atributi so posebna vrsta veje in niso podrejene veje. Z atributi se manipulira s posebnimi metodami, ki jih zagotavljajo objekti XML DOM.
Poleg izvajanja vmesnikov, ki jih priporoča Konzorcij svetovnega spleta (W3C), Microsoft XML DOM vsebuje metode, ki podpirajo XSL, vzorce XSL, imenske prostore in vrste podatkov. Metoda SelectNodes vam na primer omogoča uporabo sintakse vzorca XSL za iskanje vej v določenem kontekstu, metoda TransformNode pa podpira uporabo XSL za izvajanje transformacij.
Preizkusite dokument XML
Kot primer dokumenta XML vzemimo imenik glasbenih CD-ROM-ov, ki ima naslednjo strukturo:
Zdaj smo pripravljeni na ogled objektnega modela XML DOM, ki ga bomo začeli z objektom XMLDOMDocument.
Dokument XML – objekt XMLDOMDocument
Delo z dokumentom XML se začne z nalaganjem. Za to uporabimo metodo Load, ki ima samo en parameter, ki označuje URL dokumenta, ki se naloži. Pri nalaganju datotek z lokalnega diska je navedeno samo polno ime datoteke (v tem primeru lahko protokol file:/// izpustimo). Če je dokument XML shranjen kot niz, morate za nalaganje dokumenta uporabiti metodo LoadXML.
Za nadzor načina nalaganja dokumenta (sinhrono ali asinhrono) uporabite lastnost Async. Privzeto je ta lastnost nastavljena na True, kar pomeni, da je dokument naložen asinhrono in da je nadzor vrnjen aplikaciji, preden je dokument v celoti naložen. V nasprotnem primeru se dokument naloži sinhrono, nato pa morate preveriti vrednost lastnosti ReadyState, da ugotovite, ali se je dokument naložil ali ne. Ustvarite lahko tudi upravljalnik dogodkov OnReadyStateChange, ki bo prejel nadzor, ko se spremeni vrednost lastnosti ReadyState.
V nadaljevanju je prikazano, kako naložiti dokument XML z metodo Load:
Uporablja ... MSXML_TLB ... procedure TForm1.Button1Click(Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // // Tukaj je koda, ki manipulira // z dokumentom XML in njegovimi vejami // XMLDoc:= Nič; konec;
Ko je dokument naložen, lahko dostopamo do njegovih lastnosti. Tako bo lastnost NodeName vsebovala vrednost #document, lastnost NodeTypeString bo vsebovala vrednostni dokument, lastnost URL pa bo vsebovala vrednost file:///C:/DATA/DATA.xml.
Obravnava napak
Posebej zanimive so lastnosti, povezane z obdelavo dokumenta, ko je naložen. Tako lastnost ParseError vrne objekt XMLDOMParseError, ki vsebuje informacije o napaki, do katere je prišlo med obdelavo dokumenta.
Če želite napisati obravnavo napak, lahko dodate naslednjo kodo:
Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; Če XMLError.ErrorCode<>0 Nato // // Tukaj obravnavamo napako // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nič;
Če želite videti, katere informacije so vrnjene v primeru napake, spremenimo naslednji vnos v imeniku:
odstranitev zapiralnega elementa
Zdaj pa napišimo kodo, ki vrne vrednosti lastnosti objekta XMLDOMParseError:
XMLError:= XMLDoc.ParseError; Če XMLError.ErrorCode<>0 Nato se z XMLError začne Memo1.Lines Add('File: ' + URL); Add('Koda: ' + IntToStr(ErrorCode)); Dodaj ('Napaka: ' + Razlog); Dodaj ('Besedilo: ' + SrcText); Dodaj('Vrstica: ' + IntToStr(Vrstica)); Add('Položaj: ' + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); Konec;
in zaženimo našo aplikacijo. Posledično prejmemo naslednje informacije o napaki.
Kot lahko vidite iz zgornjega primera, so informacije, ki jih vrne objekt XMLDOMParseError, povsem dovolj za lokalizacijo napake in razumevanje razloga za njeno pojavljanje.
Zdaj pa obnovimo zaključni element
Dostop do drevesa dokumentov
Za dostop do drevesa dokumentov lahko pridobite korenski element in nato ponovite njegove podrejene veje ali poiščete določeno vejo. V prvem primeru dobimo korenski element prek lastnosti DocumentElement, ki vrne objekt tipa XMLDOMNode. Naslednje prikazuje, kako uporabiti lastnost DocumentElement za pridobitev vsebine vsakega podrejenega elementa:
Varno vozlišče: IXMLDOMNode; Koren: IXMLDOMElement; I: celo število; ... Root:= XMLDoc.DocumentElement; Za I:= 0 do Root.ChildNodes.Length-1 naredite Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); Konec;
Za naš dokument XML bomo dobili naslednje besedilo.
Če nas zanima določena veja ali veja pod prvo podrejeno vejo, lahko uporabimo metodo NodeFromID ali metodo GetElementByTagName objekta XMLDOMDocument.
Metoda NodeFromID zahteva edinstven identifikator, definiran v shemi XML ali definiciji tipa dokumenta (DTD), in vrne vejo s tem identifikatorjem.
Metoda GetElementByTagName zahteva podajanje niza z določenim elementom (oznako) in vrne vse veje s tem elementom. Spodaj je opisano, kako s to metodo poiščete vse izvajalce v našem imeniku CD-ROM-a:
Vozlišča: IXMLDOMNodeList; Vozlišče: IXMLDOMNode; ... Vozlišča:= XMLDoc.GetElementsByTagName('ARTIST'); Za I:= 0 do Nodes.Length-1 naredite Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); Konec;
Za naš dokument XML bomo dobili naslednje besedilo
Upoštevajte, da metoda SelectNodes objekta XMLDOMNode zagotavlja bolj prilagodljiv način za dostop do vej dokumenta. A več o tem v nadaljevanju.
Veja dokumenta - objekt XMLDOMNode
Objekt XMLDOMNode predstavlja vejo dokumenta. Ta objekt smo že srečali, ko smo dobili korenski element dokumenta:
Root:= XMLDoc.DocumentElement;
Če želite pridobiti informacije o veji dokumenta XML, lahko uporabite lastnosti objekta XMLDOMNode (tabela 1).
Za dostop do podatkov, shranjenih v veji, običajno uporabite lastnost NodeValue (na voljo za atribute, besedilne veje, komentarje, navodila za obdelavo in razdelke CDATA), lastnost Text, ki vrne besedilno vsebino veje, ali lastnost NodeTypedValue . Slednji pa se lahko uporablja samo za veje s tipiziranimi elementi.
Krmarjenje po drevesu dokumentov
Objekt XMLDOMNode nudi številne načine za krmarjenje po drevesu dokumenta. Na primer, za dostop do nadrejene veje se uporablja lastnost ParentNode (tip XMLDOMNode), do podrejenih vej se dostopa prek lastnosti ChildNodes (tip XMLDOMNodeList), FirstChild in LastChild (tip XMLDOMNode) itd. Lastnost OwnerDocument vrne objekt tipa XMLDOMDocument, ki identificira sam dokument XML. Zgoraj navedene lastnosti vam omogočajo preprosto krmarjenje po drevesu dokumenta.
Zdaj pa pojdimo skozi vse veje dokumenta XML:
Root:= XMLDoc.DocumentElement; Za I:= 0 do Root.ChildNodes.Length-1 naredite Begin Node:= Root.ChildNodes.Item[I]; If Node.HasChildNodes Then GetChilds(Node,0); Konec;
Kot je navedeno zgoraj, SelectNodes objekta XMLDOMNode zagotavlja bolj prilagodljiv način za dostop do vej dokumenta. Poleg tega obstaja metoda SelectSingleNode, ki vrne samo prvo vejo dokumenta. Obe metodi vam omogočata, da določite predloge XSL za iskanje vej.
Sprehodimo se skozi postopek uporabe metode SelectNodes za pridobivanje vseh vej, ki imajo vejo CD in podvejo PRICE:
Root:= XMLDoc.DocumentElement; Vozlišča:= Root.SelectNodes('CD/PRICE');
Vse podveje PRICE veje CD bodo uvrščene v zbirko vozlišč. K razpravi o predlogah XSL se bomo vrnili malo kasneje.
Manipuliranje podrejenih vej
Za manipulacijo podrejenih vej lahko uporabimo metode objekta XMLDOMNode (tabela 2).
Če želite popolnoma izbrisati vnos za prvi disk, morate zagnati naslednjo kodo:
Var XMLDoc: IXMLDOMDocument; Koren: IXMLDOMNode; Vozlišče: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // Pridobite korenski element Root:= XMLDoc.DocumentElement; Vozlišče:= koren; // Odstrani prvo podrejeno vejo Node.RemoveChild(Node.FirstChild);
Upoštevajte, da v tem primeru brišemo prvo podrejeno vejo. Kako odstraniti prvi element prve podrejene veje je prikazano spodaj:
Var XMLDoc: IXMLDOMDocument; Koren: IXMLDOMNode; Vozlišče: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // Pridobite korenski element Root:= XMLDoc.DocumentElement; // in prva podrejena veja Node:= Root.FirstChild; // Odstrani prvo podrejeno vejo Node.RemoveChild(Node.FirstChild);
V zgornjem primeru nismo izbrisali prve veje
Zdaj pa dodamo novo vejo. Spodaj je koda, ki prikazuje, kako dodati nov vnos glasbenega CD-ROM-a:
Var NewNode: IXMLDOMNode; Podrejeni: IXMLDOMNode; ... // Ustvari novo vejo -
Zgornja koda prikazuje naslednje zaporedje korakov za dodajanje nove veje:
- Ustvarjanje nove veje z uporabo metode CreateNode:
- ustvarjanje elementa z metodo CreateNode;
- dodajanje elementa v vejo z uporabo metode AppendChild;
- nastavitev vrednosti elementa preko lastnosti Text;
- ... ponovite za vse elemente.
- Dodajanje nove veje v dokument z uporabo metode AppendChild.
Spomnimo se, da metoda AppendChild doda vejo na konec drevesa. Če želite dodati vejo na določeno mesto v drevesu, morate uporabiti metodo InsertBefore.
Nabor vej – objekt XMLDOMNodeList
Objekt XMLNodeList vsebuje seznam vej, ki jih je mogoče zgraditi z uporabo metod SelectNodes ali GetElementsByTagName ali pridobiti iz lastnosti ChildNodes.
Uporabo tega predmeta smo si že ogledali v primeru v razdelku »Krmarjenje po drevesu dokumentov«. Tukaj podajamo nekaj teoretičnih pripomb.
Število vej na seznamu je mogoče pridobiti kot vrednost lastnosti Length. Veje imajo indekse od 0 do Length-1, vsaka posamezna veja pa je dostopna prek elementa polja Item z ustreznim indeksom.
Krmarjenje po seznamu vej je mogoče izvesti tudi z uporabo metode NextNode, ki vrne naslednjo vejo na seznamu ali Nil, če je trenutna veja zadnja. Za vrnitev na začetek seznama pokličite metodo Reset.
Ustvarjanje in shranjevanje dokumentov
Doslej smo si ogledali, kako lahko obstoječim dokumentom XML dodate veje in elemente. Zdaj pa sproti ustvarimo dokument XML. Najprej vas spomnimo, da je dokument mogoče naložiti ne samo iz URL-ja, ampak tudi iz navadnega niza. Naslednje prikazuje, kako ustvariti korenski element, ki ga lahko nato uporabite za dinamično gradnjo drugih elementov (kar smo že obravnavali v razdelku Manipuliranje podrejenih vej):
Var XMLDoc: IXMLDOMDocument; Koren: IXMLDOMNode; Vozlišče: IXMLDOMNode; S: WideString; ... S:= '
Ko konstruiramo dokument XML, ga bomo shranili v datoteko z metodo Shrani. Na primer:
XMLDoc.Save('C:\DATA\NEWCD.XML');
Poleg shranjevanja v datoteko vam metoda Shrani omogoča, da dokument XML shranite v nov objekt XMLDOMDocument. V tem primeru je dokument v celoti obdelan in posledično se preverita njegova struktura in sintaksa. Spodaj je prikazano, kako shraniti dokument v drug objekt:
Procedure TForm1.Button2Click(Pošiljatelj: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nič; konec;
Nazadnje upoštevajte, da vam metoda Shrani omogoča tudi shranjevanje dokumenta XML v druge objekte COM, ki podpirajo vmesnike IStream, IPersistStream ali IPersistStreamInit.
Uporaba XSL predlog
Ko smo razpravljali o metodi SelectNodes objekta XMLDOMNode, smo omenili, da zagotavlja bolj prilagodljiv način za dostop do vej dokumenta. Prilagodljivost je v tem, da lahko določite XSL predlogo kot kriterij za izbiro vej. Takšne predloge zagotavljajo močan mehanizem za iskanje informacij v dokumentih XML. Če želite na primer dobiti seznam vseh naslovov glasbenih CD-ROM-ov v našem katalogu, lahko zaženete naslednjo poizvedbo:
Če želite izvedeti, kateri diski izvajalcev so bili izdani v ZDA, je zahteva oblikovana na naslednji način:
Vozlišča:= Root.SelectNodes('CD/IZVAJALEC');
Naslednje prikazuje, kako najti prvi pogon v imeniku:
Vozlišča:= Root.SelectNodes('CD/TITLE');
In nazadnje:
Vozlišča:= Root.SelectNodes('CD/TITLE');
Če želite najti zgoščenke Boba Dylana, lahko zaženete naslednjo poizvedbo:
Vozlišča:= Root.SelectNodes(‘CD[$any$ ARTIST= ”Bob Dylan”]/TITLE’);
in da dobimo seznam plošč, izdanih po letu 1985, zaženemo naslednjo poizvedbo:
Vozlišča:= Root.SelectNodes('CD/TITLE');
Podrobnejša razprava o sintaksi XSL zahteva ločeno objavo. Da bi navdušil bralce in spodbudil nadaljnje raziskave, bom podal samo en majhen primer možne uporabe XSL. Recimo, da moramo naš katalog pretvoriti v običajno tabelo HTML. S tradicionalnimi metodami moramo iti skozi vse veje drevesa in oblikovati ustrezne oznake za vsak prejeti element
Z uporabo XSL preprosto ustvarimo predlogo (ali listo slogov), v kateri navedemo, kaj je treba pretvoriti in kako. Nato to predlogo prekrijemo z našim imenikom - in končali smo: imamo besedilo predloge XSL, ki pretvori imenik v tabelo (izpis 2).
Koda za prekrivanje predloge XSL v našem imeniku izgleda takole:
Procedure TForm1.Button2Click(Pošiljatelj: TObject); var XSLDoc: IXMLDOMDocument; začetek XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\DATA\DATA.xsl'); Memo2.Text:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= nič; konec;
Če zaključimo našo razpravo o XSL, je treba povedati, da se trenutno ta jezik aktivno uporablja za pretvorbo med različnimi dokumenti XML, pa tudi za oblikovanje dokumentov.
Zaključek
Iz očitnih razlogov je nemogoče pregledati vse objekte Microsoft XML DOM in navesti primere njihove uporabe v enem članku. Tukaj smo se dotaknili le osnovnih vprašanj uporabe XML DOM v aplikacijah. V tabeli Slika 3 prikazuje vse objekte, implementirane v Microsoft XML DOM.
ComputerPress 12"2000
Kljub dejstvu, da je bila tema dela z XML v Delphiju precej razpravljana na internetu, se vprašanja o tej temi pogosto pojavljajo na različnih forumih.
Tudi jaz sem že napisal, vendar bi se rad vrnil k resničnemu primeru hitrega razčlenjevanja XML datoteke in ekstrahiranja podatkov, ki sem ga počel danes v službi. Za pridobitev potrebnih podatkov nisem potreboval več kot 5 minut.
Ozadje. Danes smo morali obdelati podatke o nameščenih programih na uporabnikovih računalnikih (ja, ja, zaznavamo pirate :)). Tehnični oddelek mi je posredoval te informacije, odvzete od nič hudega slutečih uporabnikov prek omrežja z WMI. Program, ki so ga uporabili, izdeluje poročila v formatu XML. Temu primerno so mi prinesli goro datotek XML s precej zapleteno strukturo, iz katere sem moral samo izluščiti imena nameščenih programskih izdelkov. Zdravljenje. Ko sem ročno pregledal nekaj datotek, sem ugotovil, da ne bo trajalo dolgo, da bi se postaral, in se odločil napisati majhen pretvornik. Ko sem zagnal Delphi, sem v repozitoriju izbral objekt XML DataBinding in mu dodal eno od datotek. Vse nastavitve in parametre sem pustil privzeto in posledično sem ustvaril modul z velikim številom razredov in vmesnikov za dostop do elementov te datoteke XML. Nisem porabil veliko časa za ugotavljanje strukture razreda in sem takoj prešel na pisanje pretvornika. V novi konzolni aplikaciji sem napisal precej preprosto kodo:
program XML2TXT;
uporablja
Obrazci
Razredi, SysUtils,
SoftwareXML v "SoftwareXML.pas";
postopek CovertXML2Text;
var
softbase: IXMLSTDSoftwareType;
i:celo število;
sr: TSearchRec;
CurDir: niz;
ExportFile: TStringList;
začeti
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
če je FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0, potem
ponovite
ExportFile:= TStringList.Create;
softbase:= LoadSTDSoftware(Pchar(CurDir+sr.Name));
for i:= 0 do softbase.InstalledSoftware.source.software.Count - 1 do
ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);
ExportFile.Sort;
ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+".txt");
ExportFile.Free;
dokler FindNext(sr) 0;
konec;
začeti
Application.Initialize;
CovertXML2Text;
konec.
Posledično sem imel za vsak računalnik v omrežju eno besedilno datoteko, ki je vsebovala seznam nameščene programske opreme.
Zdi se mi, da ta koda zahteva nekaj razlage. Zakaj sem na primer uporabil modul Forms v konzolni aplikaciji in poklical proceduro Application.Initialize;?
Pravzaprav je preprosto – gre za majhen vdor, ki vam omogoča uporabo XML Data Binding v konzolni aplikaciji. Ker trmasto ni hotel inicializirati razreda za delo z XML. Nisem še ugotovil pravih razlogov - čas je bil danes pomemben, 4 od 5 minut sem že porabil za boj proti tej napaki. :) Mislim, da se bom kasneje ukvarjal s tem problemom in napisal kaj je pravi razlog.
Nenavaden razred softbase je bil ustvarjen na podlagi datoteke XML - to je bilo ime korenskega elementa in softbase.InstalledSoftware.source.software[i].DisplayName - preprosto se pomaknite med ugnezdenimi elementi do želenega in pridobite njegovo vrednost.
Tako je pravzaprav videti eden najhitrejših načinov za delo z XML v Delphiju.
V zadnjem času je veliko pozornosti namenjene izgradnji sistemov e-poslovanja ali kot jih tudi imenujemo – B2B (business to business). Upoštevajoč priporočila za izgradnjo pretočnih sistemov izmenjave organa, ki koordinira internetne tehnologije - WWW Consortium: poudarek je na tehnologijah XML in izdelavi sistemov za izmenjavo dokumentov XML.
Prednost uporabe XML v elektronskem poslovanju je visoka učinkovitost B2B sistemov ob nizkih stroških njegovega ustvarjanja zaradi jasne in vizualne predstavitve strukturiranih informacij, zmožnosti uporabe sodobnih omrežnih protokolov in ustvarjanja poslovnih sistemov v realnem času.
Neodvisnost podajanja informacij v obliki XML dokumentov omogoča različnim podjetjem, ki sodelujejo v elektronskem poslovanju, da izdelujejo programsko opremo neodvisno drug od drugega.
V vseh sistemih je izmenjava običajno zgrajena po isti shemi z uporabo zahtev HTTP. Protokol SSL se uporablja kot protokol za varnost informacij (vendar je to posebna tema).
Ena od možnih možnosti za obdelavo sporočil XML je izgradnja aplikacij BIN/CGI (ISAPI) ali komponent COM (strežnik), ki ustvarjajo ali obdelujejo dokumente XML.
Na eni strani aplikacija deluje kot odjemalec, ki izda HTTP zahtevo v načinu POST, na drugi strani pa je WEB strežnik, na strani katerega se zahteva obdela in izda odgovor. Dokumenti XML se uporabljajo pri izmenjavi informacij.
Ena najučinkovitejših možnosti implementacije je uporaba obstoječega razčlenjevalnika XML, ki podpira model DOM. Ta razčlenjevalnik je distribucijski paket Win`98 ali komponenta IE 4.7 in višje (za Win`95) in predstavlja strežnik COM, ki se nahaja v knjižnici msxml.dll.
Model komponentnih objektov (COM) – predstavlja inkapsulirane podatke in metode v eno samo entiteto ter način dostopa do njih prek sistema vmesnikov. Z Delphijem je zelo enostavno dostopati do razredov COM objekta (v enem COM strežniku je lahko vključenih več razredov). Do objektov se dostopa z inicializacijo primerka razreda prek sistema vmesnikov. Opis vmesnikov se izvaja z jezikom za definicijo vmesnika (IDL), ki se lahko izvede samodejno z uporabo okolja.
Uvoz orodij Delphi s strežnika COM msxml.dll, zgrajene so opisne datoteke vmesnika IDL in binarna opisna datoteka tipov knjižnic - TLB. Ta operacija se izvede prek sistemskega menija: Projekt | Vrsta uvoza knjižnice:(slika 1). Nato se prikaže pogovorno okno (slika 2), v katerem morate izbrati objekt COM (v našem primeru je objekt registriran pod imenom "Microsoft.XMLDom (različica 2.0)") in ustvariti datoteko TLB (gumb Ustvari enoto). Z uporabo datoteke TLB okolje ustvari opisno datoteko strežnika COM "Pascal" - MSXML_TLB.pas
Datoteka MSXML_TLB.pas opisuje vse vmesnike, konstante in sorazrede strežnika COM.
Za dostop do predmetov elementov COM je to potrebno v direktivi UPORABE dodajte ime opisne datoteke knjižnice (MSXML_TLB.pas). Spodaj je preprost program, ki uporablja standardni razčlenjevalnik DOM msxml.dll, ki naloži dokument XML in ga prikaže v elementu besedilnega polja Memo1.
uporablja Windows, sporočila, SysUtils, razredi, grafika, kontrolniki, obrazci, pogovorna okna, OleServer, MSXML_TLB, StdCtrls; vrsta TForm1 = razred(TForm)Button1: TButton; Beležka1: TMemo; postopek Button1Click(Pošiljatelj: TObject); konec; var Obrazec1: TForm1; izvajanje($R *.DFM) Postopek TForm1.Button1Click(Pošiljatelj: Predmet); // deklaracija korazreda objekta DOMDocument; var coDoc: CoDOMDocument; // razred, skladen z vmesnikom IDOMDocument; var Dokument: IXMLDOMDocument; začeti // ustvarjanje primerka objekta DOMDocument; Doc:= coDoc.Create; // klic metode Load instance objekta DOMDocument; Doc.load("data.xml"); // dostop do lastnosti xml primerka objekta DOMDocument; Memo1.Text:=Doc.xml; konec; konec.Koncept DOM - objektni model dokumenta
Vsak XML dokument je predstavljen kot niz številnih objektov (razredov), s pomočjo katerih je možen dostop do posameznih elementov (objektnih polj). DOM - vmesnik opisuje dostop tako do preprostih objektov tipa DOMString ali CharacterData kot do delov ali posameznih elementov dokumenta XML: DOMFragmentElement, DOMNode, DOMElement.
Spodaj so najpomembnejše lastnosti in metode objektov XMLDOMNode, XMLDOMNode, XMLDOMNodeList. Upoštevati je treba, da spodaj predstavljene metode in funkcije objektov DOM (Document Object Model) uporablja razčlenjevalnik Microsoft XML msxml.dll in so nekoliko širše od modela DOM, ki ga je odobril konzorcij W3C.
Popolnejši opis vmesnika objekta DOM je na voljo na
Objekt XMLDOMDocument | |
Predstavlja najvišjo raven hierarhije objektov in vsebuje metode za delo z dokumentom: nalaganje, analiziranje, ustvarjanje elementov, atributov, komentarjev v njem itd. . | |
Lastnosti | |
Asinhrono | Lastnost, ki identificira trenutni način obdelave |
ParseError | Vrne sklic na objekt za obravnavanje napak XMLDOMParseError |
Omogoči - onemogoči preverjanje dokumentov. | |
url | Vrne URL dokumenta |
documentElement | Vsebuje sklic na korenski element dokumenta kot objekt XMLDOMElement. |
Metode | |
naloži (url) loadXML(xmlString) |
Naloži dokument XML, |
shrani (objTarget) | Shrani dokument XML v datoteko |
splav | Prekinitev procesa nalaganja in obdelave dokumenta. |
createAttribute(ime) | Ustvari nov atribut s podanim imenom za trenutni element. |
createNode(Vrsta, ime, nameSpaceURI) | Ustvari vozlišče podane vrste in imena |
createElement(tagName) | Ustvari element dokumenta s podanim imenom. |
createTextNode(podatki) | Ustvari besedilo znotraj dokumenta |
getElementsByTagName(imeoznake) | Vrne sklic na zbirko elementov dokumenta z danim imenom |
nodeFromID(idString) | Iskanje elementa po ID-ju |
Objekt XMLDOMNode | |
Objekt XMLDOMNode, ki izvaja osnovni vmesnik DOM Vozlišče, je namenjen manipuliranju z enim vozliščem drevesa dokumentov. Njegove lastnosti in metode vam omogočajo pridobivanje in spreminjanje popolnih informacij o trenutnem vozlišču - njegovem tipu, imenu, polnem imenu, njegovi vsebini, seznamu podrejenih elementov itd. | |
Lastnosti | |
ime vozlišča, osnovno ime | Vrne ime trenutnega vozlišča. |
predpono | Vrne predpono imenskega prostora. |
dataType | Določa vrsto vsebine trenutnega vozlišča |
nodeType, nodeTypeString | Vrne vrsto trenutnega vozlišča: |
lastnosti | Vrne seznam atributov trenutnega vozlišča kot zbirko XMLDOMNamedNodeMap. |
besedilo | Vrne vsebino trenutnega poddrevesa kot besedilo |
xml | Vrne XML predstavitev trenutnega poddrevesa. |
nodeValue | Vrne vsebino trenutnega vozlišča. |
childNodes | Vrne seznam podrejenih elementov kot XMLDOMNodeList. |
firstChild, lastChild | Vrne prvi/zadnji podrejeni element |
prejšnji brat, naslednji brat | Vrne prejšnji/naslednji sorodniški element. |
parentNode | Vsebuje povezavo do nadrejenega elementa. |
lastnikDokument | Vrne kazalec na dokument, v katerem je trenutno vozlišče. |
Metode | |
appendChild(newChild) | Trenutnemu vozlišču doda nov podrejeni element. |
vstaviPred(novOtrok, refOtrok) | Vstavi podrejeno vozlišče in ga postavi v trenutno poddrevo "levo" od vozlišča, ki ga določa parameter refChild. |
cloneNode(globoko) | Ustvarite kopijo trenutnega elementa. |
getAttribute(ime) getAttributeNode(ime) setAttribute(ime, vrednost) setAttributeNode(XMLDOMAttribute) |
Dostop do atributov (ustvarjanje, branje, pisanje) objekta. Ime je ime atributa, vrednost pa njegova vrednost. Vrne vrednost predmeta XMLDOMAttribute. |
replaceChild(newChild, oldChild) removeChild(oldChild) | Zamenja objekt oldChild trenutnega seznama podrejenih predmetov z newChild. Brisanje predmeta oldChild |
selectNodes(patternString) selectSingleNode(patternString) | Vrne objekt XMLDOMNodeList, izbran z iskalnim vzorcem ali prvim vozliščem |
transformNode(stylesheet) transformNodeToObject(stylesheet, outputObject) |
Poddrevesu trenutnega vozlišča dodeli slogovni list in vrne niz – rezultat obdelave. Sklic na objekt DOMDocument, ki vsebuje navodila XSL, se posreduje kot parameter. |
Uporaba XML v poslu.
Za jasnejšo sliko je potrebna razlaga, zakaj je vse to potrebno za razumevanje delovanja:
Pri izgradnji B2B ali korporativnega ERP sistema, pri organizaciji izmenjave informacij XML dokumentov med podjetji ali podružnicami podjetja, se uporablja učinkovito preverjen sistem prenosa informacij, ki temelji na obstoječih WEB strežnikih preko HTTP protokolov.
Na eni strani deluje aplikacija kot odjemalec, ki izda HTTP zahtevo v načinu POST, na drugi strani pa je WEB strežnik, na čigar strani se zahteva obdela in izda odgovor. Dokumenti XML se uporabljajo kot izmenjava.
Na primer, v enostavnem ERP sistemu podjetja mora računovodski program (ASU Bukhuchet) ustvariti določeno zahtevo za izdajo računa in jo prenesti v poslovalnico, ki ima skladišče (ASU Warehouse). AWP Podobna formulacija problema pri ustvarjanju sistema B2B, ko podjetje A od dobavitelja B zahteva razpoložljivost izdelkov (odda naročilo).
Podjetje A in njegov program delujeta kot odjemalec. Skladišče vzdržuje dobavitelj B, ki ima kompleks baze podatkov skladišča na strežniku SQL. Izmenjava poteka preko korporativnega WEB strežnika dobavitelja B.
Spodaj je predstavljen naslednji tipični algoritem izmenjave:
Slika 3.
- Podjetje A iniciira proces A(naročilo izdelkov), ki deluje kot WEB odjemalec.
- Postopek A generira dokument XML (na primer zahtevo za račun) in ga pošlje kot POST http zahtevo na spletni strežnik dobavitelja B. Identifikator vira aplikacije za obdelavo se uporablja kot URI. URI je lahko enak za vse vrste dokumentov ali posamezen za vsako vrsto. Vse je odvisno od strukture B2B (WEB) strežnika.
- SPLETNI strežnik analizira zahtevo in ustvari strežnik Postopek B, ki posreduje telo dokumenta XML kot parameter.
Proces B zažene spletni strežnik in se obdela kot stran ASP, aplikacija CGI (ISAPI) ali strežniški letnik JAVA (strežniška aplikacija) - Postopek B- generira zahtevo strežniku baze podatkov SQL.
- Strežnik SQL izvede potrebne operacije v bazi podatkov, ustvari odgovor in ga vrne Postopek B.
- Na podlagi odgovora strežnika SQL Postopek B generira dokument XML (odgovor) in ga vrne kot odgovor na zahtevo http odjemalski aplikaciji.
- Nato se glede na situacijo na strani odjemalca ustvari nova zahteva http ali pa se seja konča.
Nekaj besed o organizaciji pretoka dokumentov.
Splošno pravilo za razvoj sistema izmenjave dokumentov XML je:
- Prvič- razvoj diagrama poteka elektronskih dokumentov in njihove strukture;
- Drugič- razvoj tabel procesnih funkcij (podprocesov), t.j. katere funkcije v zvezi s tem, kateri dokument XML bo vsak proces izvajal.
Vsak dokument XML, tako kot dokument HTML, mora biti sestavljen iz glave sporočila (informacije, obdane z oznakami) in telesa sporočila (za zahtevo so te informacije obdane z oznakami, da odgovorijo na zahtevo). Da bi bil dokument XML pravilno oblikovan, je treba njegovi dve komponenti "Header" in "Request" uokviriti z oznakami, na primer. Vrsta standardnega dokumenta je predstavljena spodaj:
Glava (slika 4) mora za razliko od dokumenta HTML vsebovati različne vrste servisnih informacij, vključno s podatki o vrsti dokumenta, ki se prenaša, in procesu njegove obdelave. Telo dokumenta vstopi v informacijsko obdelavo, tj. vsebino, uokvirjeno z oznakami. Upoštevati je treba, da mora biti struktura naslovov enaka za vse vrste dokumentov.
Za proces, ki ga sproži strežnik, je algoritem obdelave prednostno (vendar ne nujno) sestavljen takole:
Slika 6.
Nekaj temeljnih točk pri ustvarjanju odjemalskega dela
Kot že pojasnjeno, se pri izdelavi dokumenta XML uporablja njegova predstavitev v obliki modela DOM. Spodaj je primer dela Delphi besedila programa za ustvarjanje glave sporočila xml.
postopek TThread1.HeaderCreate(Pošiljatelj: Predmet); var // deklaracija korazreda, potrebna za ustvarjanje coDoc: CoDomDocument ; // Objekt XMLDomDocument Dokument: DomDocument; r: IXMLDOMElement; Vozlišče: IXMLDOMElement; // DOMText txt: IXMLDOMText; // DOMAttribute attr: IXMLDOMAttribute; začeti // ustvarjanje dokumenta DOM Doc:=coDoc.Create; Doc.Set_async(false); // začetna iniciacija dokumenta DOM Doc.LoadXML("Upoštevati je treba, da se deklaracija spremenljivke coDoc: CoDomDocument in Doc: DomDocument ter njena izdelava z metodo Create (Doc:=coDoc.Create;) izvede enkrat. Deklaracija spremenljivke se nahaja v razdelku za deklaracijo globalne spremenljivke in ne v lokalni proceduri, kot je bilo prikazano zaradi jasnosti v tem primeru (tj. ena globalna spremenljivka tipa DomDocument na programski modul).
Rezultat zgornjega programa bo ustvarjena glava v povezavi z našim primerom dokumenta xml: prikazano na sliki 5.
Slika 5.
Slika 6.
Glavna prednost prenosa informacij v obliki dokumentov XML je, da je mogoče ustvariti sporočilo z uporabo neodvisnih struktur tabel v DBMS tako na sprejemni kot na oddajni strani. Če uporabimo naš primer, recimo, da morate prenesti informacije o računih podjetja A iz DBMS, ki ima strukturo, prikazano na sliki 6
Za ustvarjanje dokumenta xml, ki vsebuje račun, se najprej ustvari poizvedba SQL (poizvedba A) s podatki o samem računu:
IZBERI* IZ Račun_Splošno KJEŠtevilka računa = : št IZBERI Blago, kakovost, cena, HZ_cod OD Blago KJEŠtevilka računa = : št // :num - parameter, ki določa številko računa.Spodaj je del programa, ki tvori telo dokumenta xml:
postopek TThread1.DataBodyCreate(Pošiljatelj: Predmet); var // deklaracija korazreda in objekta XMLDomDocument//coDoc: CoDomDocument ; // mora biti globalen za celoten modul.//Doc: DomDocument ; // deklaracija objektov DOMElement r: IXMLDOMElement; // DOMElement; Vozlišče, vozlišče2: IXMLDOMElement; Vozlišče3, Vozlišče4: IXMLDOMElement; // DOMText txt: IXMLDOMText; str: niz; // Številka računa: celo število;- globalna spremenljivka - // ima vrednost 987654 // poizvedbaA, poizvedbaB: Vrvica;- globalna spremenljivka, // ima vrednost, ki ustreza zahtevi // poizvedbaA - zahteva A splošne informacije o računu // poizvedbaB - zahteva B informacija o blagu, ki je opisano // na računu (glej besedilo) začeti Query.Close; // glej besedilo "poizvedba A" Query.Text:= queryA; // izvrši zahtevo Query.ExecSQL; Query.Open; // pridobivanje naslova korenskega elementa r:=Doc.Get_documentElement; Vozlišče2:= Doc.createElement("Zahteva"); // ustvari element DOMElement (oznaka) Vozlišče:= Doc.createElement("Račun"); // dodajanje elementa v koren r.appendChild(Node2); // dodajanje elementa v Vozlišče2. appendChild(Node); // ustvari element DOMElement (oznaka) Node3:= Doc.createElement("Odhod"); // dodajanje elementa v Vozlišče. appendChild(Node3); // dostop do polja "Odhod" v zahtevku str:= Query.FieldByName("Odhod").AsString; // ustvarjanje besedilnega vozlišča = vrednost polja// dodeljevanje vrednosti vozlišču // besedilno vozlišče, spremenljivka str Node.appendChild(txt); // podobne operacije za oznakoKot rezultat tega postopka se ustvari naslednje besedilo dokumenta XML:
Za oblikovanje zahteve se uporabi metoda Open objekta IXMLHttpRequest:
postopek Open(const bstrMethod, - vrsta metode = "POST" bstrUrl, - naslov strežnika Url varAsync, - komunikacijski način asynchronous/synchronous = true bstrUser, - uporabniško ime za preverjanje pristnosti bstrPassword) - gesloIzdelava strežniškega dela za obdelavo dokumentov
Kot smo že omenili, lahko obdelavo zahtev HTTP izvajajo aplikacije CGI ali strežniški programčki Java. Možno je tudi pisanje ASP strani. Toda v tem primeru je prenos podatkov mogoč le z uporabo metode "GET" prek poizvedbenega niza. Čeprav je obdelava zahtev HTTP za strani ASP bolj učinkovita kot za aplikacijo CGI. Vendar po mojem mnenju ni razlike, kako procesirati, ampak bolj pomembno je rešiti vprašanje - kako zgraditi program za obdelavo in ne s kakšnimi sredstvi.
Če smo si iz prejšnjega poglavja ogledali možnosti za generiranje dokumenta XML, potem je naloga strežniške aplikacije nasprotna - razčlenjevanje dokumentov XML. Spodaj je del programa, ki razčleni dokument xml:
postopek Tthread1.DataParser(Pošiljatelj: Tobjekt); var // deklaracija objektov DOMElement r,FNode: IXMLDOMElement; Str, Ime datoteke: String; parm: niz; // deklaracija korazreda in CoDocXML, CoDocXSL, CoDocResult: CoDomDocument; // Objekt XMLDomDocument XMLDoc, XSLDoc, ResultDoc: DomDocument ; // HttpStr: niz; - globalna spremenljivka, ki vsebuje niz zahteve HTTP Začeti XMLDoc:=coDocXML.Create; XMLDoc.LoadXML(HttpStr); // pridobivanje naslova korenskega elementa r:=Doc.Get_documentElement; // pridobivanje vrednosti elementa FNode:= r.SelectSingleNode("//TypeDocument"); // pridobivanje vrednosti atributa id="Order" FileName:= FNode.GetAttibute("id"); // in oblikovanje imena datoteke Order.xsl FileName:= FileName+".xsl"; // ustvarite dokument XSLDoc XSLDoc:=coDocXSL.Create; XSLDoc.LoadXML(ime datoteke); // ustvarite dokument XMLDoc ResultDoc:=coDocResult.Create; // nastavitev načina sinhrone obdelave ResultDoc.Set_async(false); // nastavi preverjanje razčlenjevanja ResultDoc.validateOnParse:= res; // razčleni XMLDoc z uporabo predloge XSL XMLDoc.transformNodeToObject(XSLDoc, ResultDoc); // spremenljivki Str je dodeljena besedilna vrednost // nastali dokument. Str:= ResultDoc.text; // iskanje elementa FNode:= r.SelectSingleNode("//ŠtevilkaRačuna"); // in pridobivanje vrednosti elementa parm:= FNode.text; // zapre zahtevo za dostop Query.Close; Query.Text:= Str; // dodeljevanje vrednosti parametra Query.Params.AsString:= parm; // izvrši zahtevo Query.ExecSQL; konec;Celoten vrhunec analize je uporaba predloge XSL, ki se generira posebej za vsako vrsto dokumenta. Rezultat razčlenjevanja je poizvedbeni niz SQL. Pozneje bo izvajanje ustvarjenega niza poizvedbe SQL naredilo potrebne spremembe podatkov v DBMS.
Prednost uporabe razčlenjevanja skozi predlogo je v tem, da so podatki nekoliko prilagodljivi, delovanje algoritma pa popolnoma neodvisno od programske kode. Spodaj je besedilo predloge XSL, ki se uporablja za obdelavo dokumenta NAROČILO:
Pri razlagi zgornjega primera je treba opozoriti, da je uporaba para oznak formalne narave, ker po razčlenjevanju mora nastali dokument XML formalno vsebovati vsaj eno vozlišče. Metoda ResultDoc.text dodeli besedilno vrednost dokumenta XML ResultDoc, pridobljenega med razčlenjevanjem. V tem primeru je vrednost vse, kar je uokvirjeno s parom oznak in, tj. Poizvedba SQL, ki smo jo ustvarili.
Druga značilnost pisanja programa je možnost uporabe parametra SQL :št. Uporaba tega parametra vam omogoča poenostavitev besedila predloge xsl. Določanje pomena ustreznih elementov vozlišča dokumenta XML se določi tako, da na začetku izberete ime ustreznega vozlišča, na primer:
Na kratko o XSL
Okrajšava XSL izvira iz eXtensible Stylesheet Language – jezika za oblikovanje slogovnih listov (podatki XML). Kot pove že naslov, se za oblikovanje podatkov XML uporablja eXtensible Stylesheet Language (XSL). Po definiciji W3C je XSL sestavljen iz dveh delov:
- XSLT - transformacija XSL. Jezik, ki se uporablja za pretvorbo ali oblikovanje (preoblikovanje) dokumentov XML. Tako lahko s pomočjo XSLT dobimo različne odseke nabora podatkov in oblike predstavitve podatkov.
- Elementi oblikovanja. Ti elementi vključujejo vse elemente tipografskega oblikovanja podatkov, potem ko so bili obdelani z uporabo XSL. Uporablja se samo za ustvarjanje strani HTML.
Z uporabo XSLT lahko iz datoteke XML izberemo podatke, ki jih potrebujemo, in jih uredimo v obliko za predstavitev uporabniku. Na primer, v našem primeru smo podatke XML pretvorili v poizvedbo SQL. Klasična uporaba XSL je praviloma formatiranje podatkov v obliki HTML strani ali redkeje v obliki RTF datotek.
Datoteka XSL opisuje predlogo, po kateri bodo pretvorjeni podatki XML. Če se vrnemo k predlogam xsl, lahko v XSLT ločimo naslednje elemente (direktive):
XSL direktive | opis |
---|---|
xsl:uporabi-predloge | Direktiva, ki nakazuje uporabo ustreznih predlog za atribut select="ime predloge". |
xsl:atribut | ustvari drevo atributov in ga doda izhodnemu elementu, ime parametra="ime atributa", imenski prostor - URI v imenski prostor (predpona imenskega prostora) |
xsl:call-template | pokliče predlogo, atribut name="URI v predlogo" |
xsl:izberi xsl: kdaj xsl:drugače |
izbiranje na podlagi xsl:when expr="vrednotenje izraza v skriptu", jezik="ime-jezika" test= "vrednoten izraz" |
xsl:komentar | ustvari komentar v izhodnem dokumentu |
xsl:kopiraj xsl: kopija-of |
kopira trenutno vozlišče v izhodni vir ali prilepi fragment dokumenta v vozlišče, kjer je izbrani atribut = "ime izvornega vozlišča" |
xsl:element | ustvari izhodni element po imenu, atribut name="ime elementa", namespace="uri namespace reference" |
xsl:za-vsakega | znova uporabi predlogo za vsa vozlišča na seznamu vozlišč, atribut select določa seznam vozlišč |
xsl: če | preverjanje pogoja, podanega z atributom test kot izraz |
xsl:vključi | vključuje zunanjo predlogo, atribut href = "referenca URI". |
xsl:izhod | določa izhodni rezultat, atribut metode ima lahko vrednosti "xml", "html" ali "text" |
xsl:param | določa vrednost parametrov, atribut name="ime parametra", select = "value" |
xsl:navodilo za obdelavo | ustvari navodilo za obdelavo, atribut name="ime ukaza procesa" |
xsl:razvrsti | razvrsti več vozlišč, atributi select = "ime vozlišča", data-type = vrsta podatkov ("besedilo" | "število" | Qname), vrstni red = smer razvrščanja ("naraščajoče" | "padajoče") |
xsl: slogovna tabela | definira dokument predloge xsl, je korenski element za XSLT |
xsl: predloga | definira predlogo xsl, atribut name= "Predpona URI do imena predloge", match= "navedba vozlišča, na katerem je uporabljena predloga" |
xsl:besedilo | generira besedilo v izhodni tok, atribut disable-output-escaping = "da" ali "ne", označuje zmožnost generiranja znakov ESC |
xsl:vrednost-od | vstavi vrednost izbranega vozlišča kot besedilo, atribut izbire = "kazalec na vozlišče", iz katerega je vrednost vzeta |
xsl: spremenljivka | podaja vrednost meja spremenljivke, ime atributa = "ime spremenljivke", izberite = "izračun vrednosti spremenljivke" |
xsl:s-param | uporabi parameter za predlogo, name atribut = "ime parametra", select = izraz za ovrednotenje trenutnega konteksta, privzeta vrednost "." |
Zaključek
Na koncu je treba opozoriti, da uporaba standardnega razčlenjevalnika XML msxml.dll ni edino orodje za razčlenjevanje in ustvarjanje dokumentov XML. Na primer, za ustvarjanje dokumentov XML je učinkovita uporaba komponent TPageProduser in TTableProduser. Vendar ta članek samo poudarja širino in možnost uporabe modela DOM v praksi.
Avtor bo zelo hvaležen za povratne informacije o ustreznosti teme, splošni vsebini, slogu predstavitve, pa tudi za vse druge pripombe, ki bodo pripomogle k nadaljnjemu izboljšanju kakovosti pisanja zbirke člankov in izdaje knjige, ki obravnava temo. praktične strani uporabe dokumentov XML v e-trgovini. Podrobnejše informacije o praktični strani uporabe elektronskih dokumentov najdete na avtorjevem spletnem mestu www.eDocs.al.ru Načrtuje se tudi objava izvornih besedil in primerov na avtorjevem spletnem mestu.
Kako delati