Uporaba XML v okolju Delphi. Uporaba XML Document Object Model

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 , ki se nahajajo med oznakama . Tako bo naša metoda iz datoteke settings.xml prikazala besedilo v MessageBox "100px".

500 slikovnih pik 100 slikovnih pik

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:

Empire Burlesque Bob Dylan ZDA Columbia 10.90 1985 Skrij svoje srce Bonnie Tylor Združeno kraljestvo Založba CBS 9.90 1988 ... Sprosti moje srce Joe Cocker ZDA EMI 8.20 1987

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:

Empire Burlesque Bob Dylan ZDA Columbia 10.90 1985

odstranitev zapiralnega elementa v drugi vrstici:</p><p> <CD> <TITLE>Empire Burlesque <ARTIST>Bob Dylan</ARTIST> <COUNTRY>ZDA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Zdaj pa napišimo kodo, ki vrne vrednosti lastnosti objekta XMLDOMParseError:</p><p>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;</p><p>in zaženimo našo aplikacijo. Posledično prejmemo naslednje informacije o napaki.</p> <p>Kot lahko vidite iz zgornjega primera, so informacije, ki jih vrne objekt XMLDOMParseError, povsem dovolj za lokalizacijo napake in razumevanje razloga za njeno pojavljanje.</p> <p>Zdaj pa obnovimo zaključni element <TITLE>v našem dokumentu in nadaljujemo razpravo o XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Dostop do drevesa dokumentov</h2> <p>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:</p><p>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;</p><p>Za naš dokument XML bomo dobili naslednje besedilo.</p> <p>Če nas zanima določena veja ali veja pod prvo podrejeno vejo, lahko uporabimo metodo NodeFromID ali metodo GetElementByTagName objekta XMLDOMDocument.</p> <p>Metoda NodeFromID zahteva edinstven identifikator, definiran v shemi XML ali definiciji tipa dokumenta (DTD), in vrne vejo s tem identifikatorjem.</p> <p>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:</p><p>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;</p><p>Za naš dokument XML bomo dobili naslednje besedilo</p> <p>Upoštevajte, da metoda SelectNodes objekta XMLDOMNode zagotavlja bolj prilagodljiv način za dostop do vej dokumenta. A več o tem v nadaljevanju.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Veja dokumenta - objekt XMLDOMNode</h2> <p>Objekt XMLDOMNode predstavlja vejo dokumenta. Ta objekt smo že srečali, ko smo dobili korenski element dokumenta:</p><p>Root:= XMLDoc.DocumentElement;</p><p>Če želite pridobiti informacije o veji dokumenta XML, lahko uporabite lastnosti objekta XMLDOMNode (tabela 1).</p> <p>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.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Krmarjenje po drevesu dokumentov</h3> <p>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.</p> <p>Zdaj pa pojdimo skozi vse veje dokumenta XML:</p><p>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;</p><p>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.</p> <p>Sprehodimo se skozi postopek uporabe metode SelectNodes za pridobivanje vseh vej, ki imajo vejo CD in podvejo PRICE:</p><p>Root:= XMLDoc.DocumentElement; Vozlišča:= Root.SelectNodes('CD/PRICE');</p><p>Vse podveje PRICE veje CD bodo uvrščene v zbirko vozlišč. K razpravi o predlogah XSL se bomo vrnili malo kasneje.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipuliranje podrejenih vej</h3> <p>Za manipulacijo podrejenih vej lahko uporabimo metode objekta XMLDOMNode (tabela 2).</p> <p>Če želite popolnoma izbrisati vnos za prvi disk, morate zagnati naslednjo kodo:</p><p>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);</p><p>Upoštevajte, da v tem primeru brišemo prvo podrejeno vejo. Kako odstraniti prvi element prve podrejene veje je prikazano spodaj:</p><p>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);</p><p>V zgornjem primeru nismo izbrisali prve veje <CD>…</CD>, in prvi element veje je <TITLE>….

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 - NewNode:= XMLDoc.CreateNode(1, 'CD', ''); // Dodajanje elementa Child:= XMLDoc.CreateNode(1,'TITLE',''); // Dodajanje elementa NewNode.AppendChild(Child); // In nastavi njegovo vrednost Child.Text:= 'Pink Floyd'; // Dodajanje elementa <ARTIST>Child:= XMLDoc.CreateNode(1, 'ARTIST', ''); // Dodajanje elementa NewNode.AppendChild(Child); // In nastavi njegovo vrednost Child.Text:= 'Division Bell'; // Dodajanje elementa <COUNTRY>Child:= XMLDoc.CreateNode(1, 'DRŽAVA', ''); // Dodajanje elementa NewNode.AppendChild(Child); // In nastavi njegovo vrednost Child.Text:= 'UK'; // Dodajanje elementa <COMPANY>Child:= XMLDoc.CreateNode(1, 'COMPANY', ''); // Dodajanje elementa NewNode.AppendChild(Child); // In nastavi njegovo vrednost Child.Text:= ‘EMI Records Ltd.’; // Dodajanje elementa <PRICE>Child:= XMLDoc.CreateNode(1, 'PRICE', ''); // Dodajanje elementa NewNode.AppendChild(Child); // In nastavite njegovo vrednost Child.Text:= '11.99"; // Dodajte element <YEAR>Child:= XMLDoc.CreateNode(1, 'YEAR', ''); // Dodajanje elementa NewNode.AppendChild(Child); // In nastavi njegovo vrednost Child.Text:= '1994'; // In dodajte vejo Root.AppendChild(NewNode); ...</p><p>Zgornja koda prikazuje naslednje zaporedje korakov za dodajanje nove veje:</p> <ul><li>Ustvarjanje nove veje z uporabo metode CreateNode: <ul><li>ustvarjanje elementa z metodo CreateNode;</li> <li>dodajanje elementa v vejo z uporabo metode AppendChild;</li> <li>nastavitev vrednosti elementa preko lastnosti Text;</li> <li>... ponovite za vse elemente.</li> </ul></li> <li>Dodajanje nove veje v dokument z uporabo metode AppendChild.</li> </ul><p>Spomnimo se, da metoda AppendChild doda vejo na konec drevesa. Če želite dodati vejo na določeno mesto v drevesu, morate uporabiti metodo InsertBefore.</p> <h2>Nabor vej – objekt XMLDOMNodeList</h2> <p>Objekt XMLNodeList vsebuje seznam vej, ki jih je mogoče zgraditi z uporabo metod SelectNodes ali GetElementsByTagName ali pridobiti iz lastnosti ChildNodes.</p> <p>Uporabo tega predmeta smo si že ogledali v primeru v razdelku »Krmarjenje po drevesu dokumentov«. Tukaj podajamo nekaj teoretičnih pripomb.</p> <p>Š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.</p> <p>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.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Ustvarjanje in shranjevanje dokumentov</h2> <p>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):</p><p>Var XMLDoc: IXMLDOMDocument; Koren: IXMLDOMNode; Vozlišče: IXMLDOMNode; S: WideString; ... S:= ' <CATALOG></CATALOG>'; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.LoadXML(S); Root:= XMLDoc.DocumentElement; Vozlišče:= XMLDoc.CreateNode(1, 'CD', ''); Root.AppendChild(vozlišče); Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nič;</p><p>Ko konstruiramo dokument XML, ga bomo shranili v datoteko z metodo Shrani. Na primer:</p> <p>XMLDoc.Save('C:\DATA\NEWCD.XML');</p> <p>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:</p><p>Procedure TForm1.Button2Click(Pošiljatelj: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nič; konec;</p><p>Nazadnje upoštevajte, da vam metoda Shrani omogoča tudi shranjevanje dokumenta XML v druge objekte COM, ki podpirajo vmesnike IStream, IPersistStream ali IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Uporaba XSL predlog</h2> <p>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:</p><p>Če želite izvedeti, kateri diski izvajalcev so bili izdani v ZDA, je zahteva oblikovana na naslednji način:</p><p>Vozlišča:= Root.SelectNodes('CD/IZVAJALEC');</p><p>Naslednje prikazuje, kako najti prvi pogon v imeniku:</p><p>Vozlišča:= Root.SelectNodes('CD/TITLE');</p><p>In nazadnje:</p><p>Vozlišča:= Root.SelectNodes('CD/TITLE');</p><p>Če želite najti zgoščenke Boba Dylana, lahko zaženete naslednjo poizvedbo:</p><p>Vozlišča:= Root.SelectNodes(‘CD[$any$ ARTIST= ”Bob Dylan”]/TITLE’);</p><p>in da dobimo seznam plošč, izdanih po letu 1985, zaženemo naslednjo poizvedbo:</p><p>Vozlišča:= Root.SelectNodes('CD/TITLE');</p><p>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 <TD>…</TD>.</p> <p>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).</p> <p>Koda za prekrivanje predloge XSL v našem imeniku izgleda takole:</p><p>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;</p><p>Č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.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Zaključek</h2> <p>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.</p> <p>ComputerPress 12"2000</p> <p>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. <br></p><p>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. <br></p><p>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. <br><span><br><p>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. <br></p><p>V novi konzolni aplikaciji sem napisal precej preprosto kodo: <br></p> <br>program XML2TXT;</p><p>uporablja <br>Obrazci <br>Razredi, SysUtils, <br>SoftwareXML v "SoftwareXML.pas";</p><p>postopek CovertXML2Text; <br>var <br>softbase: IXMLSTDSoftwareType; <br>i:celo število; <br>sr: TSearchRec; <br>CurDir: niz; <br>ExportFile: TStringList; <br>začeti <br>CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)); <br>če je FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0, potem <br>ponovite <br>ExportFile:= TStringList.Create; <br>softbase:= LoadSTDSoftware(Pchar(CurDir+sr.Name)); <br>for i:= 0 do softbase.InstalledSoftware.source.software.Count - 1 do <br>ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName); <br>ExportFile.Sort; <br>ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+".txt"); <br>ExportFile.Free; <br>dokler FindNext(sr) 0; <br>konec;</p><p>začeti <br>Application.Initialize; <br>CovertXML2Text; <br>konec. <br></p><p>Posledično sem imel za vsak računalnik v omrežju eno besedilno datoteko, ki je vsebovala seznam nameščene programske opreme. <br></p><p>Zdi se mi, da ta koda zahteva nekaj razlage. Zakaj sem na primer uporabil modul Forms v konzolni aplikaciji in poklical proceduro Application.Initialize;? <br></p><p>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. <br></p><p>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. <br></p><p>Tako je pravzaprav videti eden najhitrejših načinov za delo z XML v Delphiju. <br></p> <p>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.</p> <p>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.</p> <p>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.</p> <p>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).</p> <p>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.</p> <p>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.</p> <p>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.</p> <p>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.</p> <p>Uvoz orodij Delphi s strežnika COM <i>msxml.dll</i>, zgrajene so opisne datoteke vmesnika IDL in binarna opisna datoteka tipov knjižnic - TLB. Ta operacija se izvede prek sistemskega menija: <b>Projekt | Vrsta uvoza knjižnice:</b>(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 <b>Ustvari enoto</b>). Z uporabo datoteke TLB okolje ustvari opisno datoteko strežnika COM "Pascal" - MSXML_TLB.pas</p> <p>Datoteka MSXML_TLB.pas opisuje vse vmesnike, konstante in sorazrede strežnika COM.</p> <p>Za dostop do predmetov elementov COM je to potrebno v direktivi <b>UPORABE</b> 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.</p> <b>uporablja</b> Windows, sporočila, SysUtils, razredi, grafika, kontrolniki, obrazci, pogovorna okna, OleServer, MSXML_TLB, StdCtrls; <b>vrsta</b> TForm1 = <b>razred</b>(TForm)Button1: TButton; Beležka1: TMemo; <b>postopek</b> Button1Click(Pošiljatelj: TObject); <b>konec;</b> <b>var</b> Obrazec1: TForm1; <b>izvajanje</b>($R *.DFM) <b>Postopek</b> TForm1.Button1Click(Pošiljatelj: Predmet); <span>// deklaracija korazreda objekta DOMDocument;</span> <b>var</b> coDoc: CoDOMDocument; <span>// razred, skladen z vmesnikom IDOMDocument;</span> <b>var</b> Dokument: IXMLDOMDocument; <b>začeti</b> <span>// ustvarjanje primerka objekta DOMDocument;</span> Doc:= coDoc.Create; <span>// klic metode Load instance objekta DOMDocument;</span> Doc.load("data.xml"); <span>// dostop do lastnosti xml primerka objekta DOMDocument;</span> Memo1.Text:=Doc.xml; <b>konec;</b> <b>konec.</b> <h2>Koncept DOM - objektni model dokumenta</h2> <p>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.</p> <p>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.</p> <p>Popolnejši opis vmesnika objekta DOM je na voljo na</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2">Objekt XMLDOMDocument</td> </tr><tr><td valign="top" colspan="2">Predstavlja najvišjo raven hierarhije objektov in vsebuje metode za delo z dokumentom: nalaganje, analiziranje, ustvarjanje elementov, atributov, komentarjev v njem itd. .</td> </tr><tr><td valign="top" colspan="2"><b>Lastnosti</b> </td> </tr><tr><td valign="top" width="39%"><b>Asinhrono</b> </td> <td valign="top" width="61%">Lastnost, ki identificira trenutni način obdelave</td> </tr><tr><td valign="top" width="39%" height="19"><b>ParseError</b> </td> <td valign="top" width="61%" height="19">Vrne sklic na objekt za obravnavanje napak XMLDOMParseError</td> </tr><tr><td valign="top" width="39%"><b>Omogoči - onemogoči preverjanje dokumentov.</b> </td> <td> </td> </tr><tr><td valign="top" width="39%"><b>url</b> </td> <td valign="top" width="61%">Vrne URL dokumenta</td> </tr><tr><td valign="top" width="39%"><b>documentElement</b> </td> <td valign="top" width="61%">Vsebuje sklic na korenski element dokumenta kot objekt XMLDOMElement.</td> </tr><tr><td valign="top" colspan="2"><b>Metode</b> </td> </tr><tr><td valign="top" width="39%"><b>naloži (url) <br>loadXML(xmlString)</b> </td> <td valign="top" width="61%">Naloži dokument XML,</td> </tr><tr><td valign="top" width="39%"><b>shrani (objTarget)</b> </td> <td valign="top" width="61%">Shrani dokument XML v datoteko</td> </tr><tr><td valign="top" width="39%"><b>splav</b> </td> <td valign="top" width="61%">Prekinitev procesa nalaganja in obdelave dokumenta.</td> </tr><tr><td valign="top" width="39%"><b>createAttribute(ime)</b> </td> <td valign="top" width="61%">Ustvari nov atribut s podanim imenom za trenutni element.</td> </tr><tr><td valign="top" width="39%"><b>createNode(Vrsta, ime, nameSpaceURI)</b> </td> <td valign="top" width="61%">Ustvari vozlišče podane vrste in imena</td> </tr><tr><td valign="top" width="39%"><b>createElement(tagName)</b> </td> <td valign="top" width="61%">Ustvari element dokumenta s podanim imenom.</td> </tr><tr><td valign="top" width="39%"><b>createTextNode(podatki)</b> </td> <td valign="top" width="61%">Ustvari besedilo znotraj dokumenta</td> </tr><tr><td valign="top" width="39%"><b>getElementsByTagName(imeoznake)</b> </td> <td valign="top" width="61%">Vrne sklic na zbirko elementov dokumenta z danim imenom</td> </tr><tr><td valign="top" width="39%"><b>nodeFromID(idString)</b> </td> <td valign="top" width="61%">Iskanje elementa po ID-ju</td> </tr></tbody></table><br><table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2"> <b>Objekt XMLDOMNode</b> </td> </tr><tr><td valign="top" colspan="2">Objekt XMLDOMNode, ki izvaja osnovni vmesnik DOM <b>Vozlišče</b>, 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.</td> </tr><tr><td valign="top" colspan="2"><b>Lastnosti</b> </td> </tr><tr><td valign="top" width=" "><b>ime vozlišča, osnovno ime</b> </td> <td valign="top" width="65%">Vrne ime trenutnega vozlišča.</td> </tr><tr><td valign="top" width="35%"><b>predpono</b> </td> <td valign="top" width="65%">Vrne predpono imenskega prostora.</td> </tr><tr><td valign="top" width="35%"><b>dataType</b> </td> <td valign="top" width="65%">Določa vrsto vsebine trenutnega vozlišča</td> </tr><tr><td valign="top" width="35%"><b>nodeType, nodeTypeString</b> </td> <td valign="top" width="65%">Vrne vrsto trenutnega vozlišča:</td> </tr><tr><td valign="top" width="35%"><b>lastnosti</b> </td> <td valign="top" width="65%">Vrne seznam atributov trenutnega vozlišča kot zbirko XMLDOMNamedNodeMap.</td> </tr><tr><td valign="top" width="35%"><b>besedilo</b> </td> <td valign="top" width="65%">Vrne vsebino trenutnega poddrevesa kot besedilo</td> </tr><tr><td valign="top" width="35%"><b>xml</b> </td> <td valign="top" width="65%">Vrne XML predstavitev trenutnega poddrevesa.</td> </tr><tr><td valign="top" width="35%"><b>nodeValue</b> </td> <td valign="top" width="65%">Vrne vsebino trenutnega vozlišča.</td> </tr><tr><td valign="top" width="35%"><b>childNodes</b> </td> <td valign="top" width="65%">Vrne seznam podrejenih elementov kot XMLDOMNodeList.</td> </tr><tr><td valign="top" width="35%"><b>firstChild, lastChild</b> </td> <td valign="top" width="65%">Vrne prvi/zadnji podrejeni element</td> </tr><tr><td valign="top" width="35%"><b>prejšnji brat, naslednji brat</b> </td> <td valign="top" width="65%">Vrne prejšnji/naslednji sorodniški element.</td> </tr><tr><td valign="top" width="35%"><b>parentNode</b> </td> <td valign="top" width="65%">Vsebuje povezavo do nadrejenega elementa.</td> </tr><tr><td valign="top" width="35%"><b>lastnikDokument</b> </td> <td valign="top" width="65%">Vrne kazalec na dokument, v katerem je trenutno vozlišče.</td> </tr><tr><td valign="top" colspan="2"><b>Metode</b> </td> </tr><tr><td valign="top" width="35%"><b>appendChild(newChild)</b> </td> <td valign="top" width="65%">Trenutnemu vozlišču doda nov podrejeni element.</td> </tr><tr><td valign="top" width="35%"><b>vstaviPred(novOtrok, refOtrok)</b> </td> <td valign="top" width="65%">Vstavi podrejeno vozlišče in ga postavi v trenutno poddrevo "levo" od vozlišča, ki ga določa parameter refChild.</td> </tr><tr><td valign="top" width="35%"><b>cloneNode(globoko)</b> </td> <td valign="top" width="65%">Ustvarite kopijo trenutnega elementa.</td> </tr><tr><td valign="top" width="35%"><b>getAttribute</b><b>(ime) <br> </b><b>getAttributeNode</b><b><span>(ime) <br>setAttribute(ime, vrednost) <br>setAttributeNode(XMLDOMAttribute)</span> </b> </td> <td valign="top" width="65%">Dostop do atributov (ustvarjanje, branje, pisanje) objekta. Ime je ime atributa, vrednost pa njegova vrednost. Vrne vrednost predmeta XMLDOMAttribute.</td> </tr><tr><td valign="top" width="35%"><b>replaceChild(newChild, oldChild) removeChild(oldChild)</b> </td> <td valign="top" width="65%">Zamenja objekt oldChild trenutnega seznama podrejenih predmetov z newChild. Brisanje predmeta oldChild</td> </tr><tr><td valign="top" width="35%"><b>selectNodes(patternString) selectSingleNode(patternString)</b> </td> <td valign="top" width="65%">Vrne objekt XMLDOMNodeList, izbran z iskalnim vzorcem ali prvim vozliščem</td> </tr><tr><td valign="top" width="35%"><b>transformNode(stylesheet) <br>transformNodeToObject(stylesheet, outputObject)</b> </td> <td valign="top" width="65%">Poddrevesu trenutnega vozlišča dodeli slogovni list in vrne niz – rezultat obdelave. Sklic na objekt DOMDocument, ki vsebuje navodila XSL, se posreduje kot parameter.</td> </tr></tbody></table><br><h2>Uporaba XML v poslu.</h2> <p>Za jasnejšo sliko je potrebna razlaga, zakaj je vse to potrebno za razumevanje delovanja:</p> <p>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.</p> <p>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.</p> <p>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).</p> <p>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.</p> <p>Spodaj je predstavljen naslednji tipični algoritem izmenjave:</p> <br>Slika 3. <ol><li><b>Podjetje A</b> iniciira <b>proces A</b>(naročilo izdelkov), ki deluje kot WEB odjemalec.</li><li><b>Postopek A</b> 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.</li><li>SPLETNI strežnik analizira zahtevo in ustvari strežnik <b>Postopek B</b>, ki posreduje telo dokumenta XML kot parameter. <br>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)</li><li><b>Postopek B</b>- generira zahtevo strežniku baze podatkov SQL.</li><li>Strežnik SQL izvede potrebne operacije v bazi podatkov, ustvari odgovor in ga vrne <b>Postopek B</b>.</li><li>Na podlagi odgovora strežnika SQL <b>Postopek B</b> generira dokument XML (odgovor) in ga vrne kot odgovor na zahtevo http odjemalski aplikaciji.</li><li>Nato se glede na situacijo na strani odjemalca ustvari nova zahteva http ali pa se seja konča.</li> </ol><h2>Nekaj ​​besed o organizaciji pretoka dokumentov.</h2> <p>Splošno pravilo za razvoj sistema izmenjave dokumentov XML je:</p><ul><li><b>Prvič</b>- razvoj diagrama poteka elektronskih dokumentov in njihove strukture;</li><li><b>Drugič</b>- razvoj tabel procesnih funkcij (podprocesov), t.j. katere funkcije v zvezi s tem, kateri dokument XML bo vsak proces izvajal.</li> </ul><p>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:</p> <p>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.</p> <p>Za proces, ki ga sproži strežnik, je algoritem obdelave prednostno (vendar ne nujno) sestavljen takole:</p> <img src='https://i0.wp.com/codenet.ru/np-includes/upload/2005/01/05/128666.jpg' height="500" width="408" loading=lazy loading=lazy><br>Slika 6. <h2>Nekaj ​​temeljnih točk pri ustvarjanju odjemalskega dela</h2> <p>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.</p> <b>postopek</b> TThread1.HeaderCreate(Pošiljatelj: Predmet); <b>var</b> <span>// deklaracija korazreda, potrebna za ustvarjanje</span> coDoc: CoDomDocument ; <span>// Objekt XMLDomDocument</span> Dokument: DomDocument; r: IXMLDOMElement; Vozlišče: IXMLDOMElement; // DOMText txt: IXMLDOMText; // DOMAttribute attr: IXMLDOMAttribute; <b>začeti</b> <span>// ustvarjanje dokumenta DOM</span> Doc:=coDoc.Create; Doc.Set_async(false); <span>// začetna iniciacija dokumenta DOM</span> Doc.LoadXML(" <Header/>"); <span>// ustvarjanje DOMElementa (oznaka<<b>Pošiljatelj</b>>) </span> Vozlišče:= Doc.createElement("Pošiljatelj"); <span>// ustvari besedilno vozlišče " <b>LLC "Tajfun"</b>" </span> txt:= Doc.createTextNode("Typhoon LLC"); <span>// dodelitev vozlišču<<b>Pošiljatelj</b>> vrednost</span> <span>// besedilno vozlišče " <b>LLC "Tajfun"</b>" </span> Node.appendChild(txt); <span>// dodajanje elementa<<b>Pošiljatelj</b>> v koren dokumenta kot otroka</span> r.appendChild(Vozlišče); <span> <<b>Od</b>> </span> Vozlišče:= Doc.createElement("Od"); txt:= Doc.createTextNode("http://tayfun.ru/xml/default.asp"); Node.appendChild(txt); r.appendChild(Vozlišče); <span>// podobne operacije za oznako<<b>Za</b>> </span> Vozlišče:= Doc.createElement("Za"); txt:= Doc.createTextNode("http://irbis.ru"); Node.appendChild(txt); r.appendChild(Vozlišče); <span>// ustvari DOMElement()</span> Vozlišče:= Doc.createElement("TypeDocument"); <span>// ustvarjanje vozlišča XMLDOMAttribute</span> Att:= Doc.createAttribute("Id", "Order"); <span> // <TypeDocument Id="Order"/> </span> Node.appendChild(Att); r.appendChild(Vozlišče); <b>konec;</b> <p>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).</p> <p>Rezultat zgornjega programa bo ustvarjena glava v povezavi z našim primerom dokumenta xml: prikazano na sliki 5.</p> <img src='https://i2.wp.com/codenet.ru/np-includes/upload/2005/01/05/128662.gif' height="116" width="298" loading=lazy loading=lazy><br>Slika 5. <p><img src='https://i1.wp.com/codenet.ru/np-includes/upload/2005/01/05/128664.gif' height="179" width="385" loading=lazy loading=lazy><br>Slika 6.</p><p>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</p> <p>Za ustvarjanje dokumenta xml, ki vsebuje račun, se najprej ustvari poizvedba SQL (poizvedba A) s podatki o samem računu:</p> <b>IZBERI</b>* IZ Račun_Splošno <b>KJE</b>Številka računa = : št <b>IZBERI</b> Blago, kakovost, cena, HZ_cod <b>OD</b> Blago <b>KJE</b>Številka računa = : št <span>// :num - parameter, ki določa številko računa.</span> <p>Spodaj je del programa, ki tvori telo dokumenta xml:</p> <b>postopek</b> TThread1.DataBodyCreate(Pošiljatelj: Predmet); <b>var</b> <span>// deklaracija korazreda in objekta XMLDomDocument</span>//coDoc: CoDomDocument ; <span>// mora biti globalen za celoten modul.</span>//Doc: DomDocument ; <span>// deklaracija objektov DOMElement</span> r: IXMLDOMElement; // DOMElement; Vozlišče, vozlišče2: IXMLDOMElement; Vozlišče3, Vozlišče4: IXMLDOMElement; // DOMText txt: IXMLDOMText; str: niz; <span>// Številka računa: <b>celo število;</b>- globalna spremenljivka - // ima vrednost 987654 // poizvedbaA, poizvedbaB: <b>Vrvica;</b>- 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)</span> <b>začeti</b> Query.Close; <span>// glej besedilo "poizvedba A"</span> Query.Text:= queryA; <span>// izvrši zahtevo</span> Query.ExecSQL; Query.Open; <span>// pridobivanje naslova korenskega elementa</span> r:=Doc.Get_documentElement; Vozlišče2:= Doc.createElement("Zahteva"); <span>// ustvari element DOMElement (oznaka)</span> Vozlišče:= Doc.createElement("Račun"); <span>// dodajanje elementa v koren</span> r.appendChild(Node2); <span>// dodajanje elementa v</span> Vozlišče2. appendChild(Node); <span>// ustvari element DOMElement (oznaka)</span> Node3:= Doc.createElement("Odhod"); <span>// dodajanje elementa v</span> Vozlišče. appendChild(Node3); <span>// dostop do polja "Odhod" v zahtevku</span> str:= Query.FieldByName("Odhod").AsString; <span>// ustvarjanje besedilnega vozlišča = vrednost polja</span><span>// dodeljevanje vrednosti vozlišču</span> <span>// besedilno vozlišče, spremenljivka str</span> Node.appendChild(txt); <span>// podobne operacije za oznako <Destination>, <DataSend>, // <DataDepurture>, <Currency> // <DestinationCompany>(polje DB "Prejemnik")</span> Vozlišče:= Doc.createElement("Cilj"); <span>// ime polja baze podatkov ne sme sovpadati z imenom</span> str:= Query.FieldByName("Prejemnik ").AsString; <span>// oznaka, to je prednost uporabe</span> txt:= Doc.createTextNode(str); <span>// DOM vmesnika pred DBMS, ki podpira vmesnik XML, // kot je ORACLE 8i ali Ms SQL 2000</span> Node.appendChild(txt); ... <span>// generiranje zahteve za specifikacije blaga</span> <span>// zapre zahtevo za dostop</span> Query.Close; <span>// glej v besedilu "zahteva B", informacije. O izdelkih</span> Query.Text:= poizvedbaВ; <span>// dodeljevanje vrednosti parametrov</span> Query.Params.AsInteger:= Številka računa; <span>// izvrši zahtevo</span> Query2.ExecSQL; <span>// odpiranje dostopa do podatkov zahteve</span> Query.Open; <span>// ustvari element DOMElement (oznaka)</span> Vozlišče3:= Doc.createElement("Imems"); <span>// dodajanje elementa v</span> Vozlišče. appendChild(Node3); <span>// zanka skozi vse vrstice poizvedbe</span> <b>medtem</b> <b>ne</b> Eof.Query <b>narediti</b> begin Node4:= Doc.createElement("Imem"); <span>// dodajanje elementa v</span> Node3.appendChild(Node4); <span>// generiranje podatkov za oznako</span> str:= Query.FieldByName("Cena").AsString; txt:= Doc.createTextNode(str); Node.appendChild(txt); ... <span>// podobne operacije za oznake <HZ_Cod>, <Quality>, <GoodName> </span> <b>konec;</b> <b>konec;</b> <p>Kot rezultat tega postopka se ustvari naslednje besedilo dokumenta XML:</p> <table width="100%"><tbody><tr><td align="middle"><br><img src='https://i1.wp.com/codenet.ru/np-includes/upload/2005/01/05/128661.gif' width="100%" loading=lazy loading=lazy></td> </tr></tbody></table><p>Za oblikovanje zahteve se uporabi metoda Open objekta <b>IXMLHttpRequest</b>:</p> <b>postopek</b> 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) - geslo <h2>Izdelava strežniškega dela za obdelavo dokumentov</h2> <p>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.</p> <p>Č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:</p> <b>postopek</b> Tthread1.DataParser(Pošiljatelj: Tobjekt); <b>var</b> <span>// deklaracija objektov DOMElement</span> r,FNode: IXMLDOMElement; Str, Ime datoteke: String; parm: niz; <span>// deklaracija korazreda in</span> CoDocXML, CoDocXSL, CoDocResult: CoDomDocument; <span>// Objekt XMLDomDocument</span> XMLDoc, XSLDoc, ResultDoc: DomDocument ; <span>// HttpStr: niz; - globalna spremenljivka, ki vsebuje niz zahteve HTTP</span> <b>Začeti</b> XMLDoc:=coDocXML.Create; XMLDoc.LoadXML(HttpStr); <span>// pridobivanje naslova korenskega elementa</span> r:=Doc.Get_documentElement; <span>// pridobivanje vrednosti elementa</span> FNode:= r.SelectSingleNode("//TypeDocument"); <span>// pridobivanje vrednosti atributa id="Order"</span> FileName:= FNode.GetAttibute("id"); <span>// in oblikovanje imena datoteke Order.xsl</span> FileName:= FileName+".xsl"; <span>// ustvarite dokument XSLDoc</span> XSLDoc:=coDocXSL.Create; XSLDoc.LoadXML(ime datoteke); <span>// ustvarite dokument XMLDoc</span> ResultDoc:=coDocResult.Create; <span>// nastavitev načina sinhrone obdelave</span> ResultDoc.Set_async(false); <span>// nastavi preverjanje razčlenjevanja</span> ResultDoc.validateOnParse:= res; <span>// razčleni XMLDoc z uporabo predloge XSL</span> XMLDoc.transformNodeToObject(XSLDoc, ResultDoc); <span>// spremenljivki Str je dodeljena besedilna vrednost</span> <span>// nastali dokument.</span> Str:= ResultDoc.text; <span>// iskanje elementa</span> FNode:= r.SelectSingleNode("//ŠtevilkaRačuna"); <span>// in pridobivanje vrednosti elementa</span> parm:= FNode.text; <span>// zapre zahtevo za dostop</span> Query.Close; Query.Text:= Str; <span>// dodeljevanje vrednosti parametra</span> Query.Params.AsString:= parm; <span>// izvrši zahtevo</span> Query.ExecSQL; <b>konec;</b> <p>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.</p> <p>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:</p><p> <!-- файл Order.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="//header">INSERT v TABREG (FROM, TO, TYPEDOC,body) VALUES(" <xsl:value-of select="from" />", "<xsl:value-of select="to" />", "<xsl:value-of select="TypeDocument/@id" />") </xsl:for-each> <xsl:for-each select="//item">INSERT into GOODS (invoiceNumber, name, price, quality) VALUES(" :num", " <xsl:value-of select="name" />", "<xsl:value-of select="price" />", "<xsl:value-of select="quality" /> ") </xsl:for-each> </xsl:template> </xsl:stylesheet> </p><p>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.</p> <p>Druga značilnost pisanja programa je možnost uporabe parametra SQL <b>:št.</b> 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:</p><h2>Na kratko o XSL</h2> <p>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:</p> <ul><li>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.</li><li>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.</li> </ul><p>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.</p> <p>Datoteka XSL opisuje predlogo, po kateri bodo pretvorjeni podatki XML. Če se vrnemo k predlogam xsl, lahko v XSLT ločimo naslednje elemente (direktive):</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" width="31%"> <b>XSL direktive</b> </td><th align="middle" width="69%"> <b>opis</b> </th> </tr><tr><td>xsl:uporabi-predloge</td> <td>Direktiva, ki nakazuje uporabo ustreznih predlog za atribut select="ime predloge".</td> </tr><tr><td>xsl:atribut</td> <td>ustvari drevo atributov in ga doda izhodnemu elementu, ime parametra="ime atributa", imenski prostor - URI v imenski prostor (predpona imenskega prostora)</td> </tr><tr><td>xsl:call-template</td> <td>pokliče predlogo, atribut name="URI v predlogo"</td> </tr><tr><td>xsl:izberi <br>xsl: kdaj <br>xsl:drugače</td> <td>izbiranje na podlagi xsl:when expr="vrednotenje izraza v skriptu", <br>jezik="ime-jezika" <br>test= "vrednoten izraz"</td> </tr><tr><td>xsl:komentar</td> <td>ustvari komentar v izhodnem dokumentu</td> </tr><tr><td>xsl:kopiraj <br>xsl: kopija-of</td> <td>kopira trenutno vozlišče v izhodni vir ali prilepi fragment dokumenta v vozlišče, kjer je izbrani atribut = "ime izvornega vozlišča"</td> </tr><tr><td>xsl:element</td> <td>ustvari izhodni element po imenu, atribut name="ime elementa", namespace="uri namespace reference"</td> </tr><tr><td>xsl:za-vsakega</td> <td>znova uporabi predlogo za vsa vozlišča na seznamu vozlišč, atribut select določa seznam vozlišč</td> </tr><tr><td>xsl: če</td> <td>preverjanje pogoja, podanega z atributom test kot izraz</td> </tr><tr><td>xsl:vključi</td> <td>vključuje zunanjo predlogo, atribut href = "referenca URI".</td> </tr><tr><td>xsl:izhod</td> <td>določa izhodni rezultat, atribut metode ima lahko vrednosti "xml", "html" ali "text"</td> </tr><tr><td>xsl:param</td> <td>določa vrednost parametrov, atribut name="ime parametra", select = "value"</td> </tr><tr><td>xsl:navodilo za obdelavo</td> <td>ustvari navodilo za obdelavo, atribut name="ime ukaza procesa"</td> </tr><tr><td>xsl:razvrsti</td> <td>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")</td> </tr><tr><td>xsl: slogovna tabela</td> <td>definira dokument predloge xsl, je korenski element za XSLT</td> </tr><tr><td>xsl: predloga</td> <td>definira predlogo xsl, atribut name= "Predpona URI do imena predloge", match= "navedba vozlišča, na katerem je uporabljena predloga"</td> </tr><tr><td>xsl:besedilo</td> <td>generira besedilo v izhodni tok, atribut disable-output-escaping = "da" ali "ne", označuje zmožnost generiranja znakov ESC</td> </tr><tr><td>xsl:vrednost-od</td> <td>vstavi vrednost izbranega vozlišča kot besedilo, atribut izbire = "kazalec na vozlišče", iz katerega je vrednost vzeta</td> </tr><tr><td>xsl: spremenljivka</td> <td>podaja vrednost meja spremenljivke, ime atributa = "ime spremenljivke", izberite = "izračun vrednosti spremenljivke"</td> </tr><tr><td>xsl:s-param</td> <td>uporabi parameter za predlogo, name atribut = "ime parametra", select = izraz za ovrednotenje trenutnega konteksta, privzeta vrednost "."</td> </tr></tbody></table><h2>Zaključek</h2> <p>Na koncu je treba opozoriti, da uporaba standardnega razčlenjevalnika XML <i>msxml.dll</i> ni edino orodje za razčlenjevanje in ustvarjanje dokumentov XML. Na primer, za ustvarjanje dokumentov XML je učinkovita uporaba komponent <b>TPageProduser</b> in <b>TTableProduser</b>. Vendar ta članek samo poudarja širino in možnost uporabe modela DOM v praksi.</p> <p>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.</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> <div class="evc-social-likes" data-url="https://ymol.ru/how-to-work/ispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model/" data-title="Uporaba XML v okolju Delphi. Uporaba XML Document Object Model" data-media="https://i1.wp.com/zoo-mania.ru/wp-content/uploads/2011/08/settings.ini_.jpg"> <div class="social-likes "> <div class="facebook" title="Delite povezavo na Facebooku">Facebook</div> <div class="twitter" title="Delite povezavo na Twitterju">Twitter</div> <div class="vkontakte" title="Delite povezavo na VKontakte">V stiku z</div> <div class="plusone" title="Delite povezavo na Google Plus">Google+</div> </div> </div> <span class="thecategory"><i class="icon-globe"></i> <a href="https://ymol.ru/sl/category/how-to-work/" rel="category tag">Kako delati</a></span> </div> </article> <div class="post-tags"></div> <div class="related-posts"> <h4>Morda vam bo tudi všeč</h4> <article id="post-33821" class="latestpost post-33821 post type-post status-publish format-standard hentry category-poleznye-sovety"> <a href="https://ymol.ru/sl/setting/na-materinskoi-plate-vyhod-lpt-chto-takoe-lpt-port-i-dlya-chego-on-nuzhen-rezhimy/" title="Kaj so vrata »LPT« in čemu so namenjena?" id="featured-thumbnail"> <div class="featured-thumbnail"> <img src="/uploads/9a2bf02984db0a074c353c4771994484.jpg" alt="Kaj so vrata »LPT« in čemu so namenjena?" / loading=lazy loading=lazy> </div> </a> <header class="entry-header"> <h1 class="entry-title"><a href="https://ymol.ru/sl/setting/na-materinskoi-plate-vyhod-lpt-chto-takoe-lpt-port-i-dlya-chego-on-nuzhen-rezhimy/" rel="bookmark">Kaj so vrata »LPT« in čemu so namenjena?</a></h1> </header> </article> <article id="post-33820" class="latestpost post-33820 post type-post status-publish format-standard hentry category-poleznye-sovety"> <a href="https://ymol.ru/sl/overview/muzykalnaya-usb-klaviatura-k-kompyuteru-svoimi-rukami-izgotavlivaem/" title="Izdelava elektronskega klavirja iz tipkovnice MIDI z lastnimi rokami" id="featured-thumbnail"> <div class="featured-thumbnail"> <img src="/uploads/b6d4f936184e8ffe60bce8f2f1fa6958.jpg" alt="Izdelava elektronskega klavirja iz tipkovnice MIDI z lastnimi rokami" / loading=lazy loading=lazy> </div> </a> <header class="entry-header"> <h1 class="entry-title"><a href="https://ymol.ru/sl/overview/muzykalnaya-usb-klaviatura-k-kompyuteru-svoimi-rukami-izgotavlivaem/" rel="bookmark">Izdelava elektronskega klavirja iz tipkovnice MIDI z lastnimi rokami</a></h1> </header> </article> <article id="post-33819" class="latestpost post-33819 post type-post status-publish format-standard hentry category-poleznye-sovety"> <a href="https://ymol.ru/sl/operation/wileyfox-swift---dostoinyi-smartfon-zadeshevo-obzor-wileyfox-swift-samyi-hitryi/" title="Pregled Wileyfox Swift - Najbolj zvit med proračunskimi uslužbenci Videz in enostavnost uporabe" id="featured-thumbnail"> <div class="featured-thumbnail"> <img src="/uploads/1b2450051b02e6d5028c15dcd4d33401.jpg" alt="Pregled Wileyfox Swift - Najbolj zvit med proračunskimi uslužbenci Videz in enostavnost uporabe" / loading=lazy loading=lazy> </div> </a> <header class="entry-header"> <h1 class="entry-title"><a href="https://ymol.ru/sl/operation/wileyfox-swift---dostoinyi-smartfon-zadeshevo-obzor-wileyfox-swift-samyi-hitryi/" rel="bookmark">Pregled Wileyfox Swift - Najbolj zvit med proračunskimi uslužbenci Videz in enostavnost uporabe</a></h1> </header> </article> </div> </main> <div id="sidebar" class="sidebar c-4-12" role="complementary" itemscope itemtype="http://schema.org/WPSideBar"> <aside id="recent-posts-3" class="widget widget_recent_entries"> <h3 class="widget-title">Najbolj priljubljena</h3> <ul> <li class='li1'><a href='https://ymol.ru/sl/overview/nevidimye-znaki-formatirovaniya-v-microsoft-word-kak-sdelat/' title='Kako narediti nevidno ime?'>Kako narediti nevidno ime?</a></li> <li class='li1'><a href='https://ymol.ru/sl/reviews/gde-luchshe-zhit-v-rossii-top-luchshih-gorodov-rossiiskoi-federacii-numerologiya-gorodov-besplatnyi-on/' title='Najboljša mesta Ruske federacije'>Najboljša mesta Ruske federacije</a></li> <li class='li1'><a href='https://ymol.ru/sl/operation/smaily-i-ih-znacheniya-shokiruyushchaya-pravda-o-serdechkah-i-smailah/' title='Šokantna resnica o srčkih in emotikonih!'>Šokantna resnica o srčkih in emotikonih!</a></li> <li class='li1'><a href='https://ymol.ru/sl/how-to-work/novaya-mehanika-izmeneniya-vneshnego-vida-v-world-of-tanks-novaya/' title='Nova mehanika za spreminjanje videza v World of Tanks World of tanks spremeni pogled kamere'>Nova mehanika za spreminjanje videza v World of Tanks World of tanks spremeni pogled kamere</a></li> <li class='li1'><a href='https://ymol.ru/sl/reviews/gpmdp-desktopnyi-pleer-dlya-google-play-music-s-podderzhkoi-skrobblinga-i-goryachih/' title='Kako prenesti Google Play Music v svoj računalnik: nekaj praktičnih nasvetov Kaj je Google Play Music'>Kako prenesti Google Play Music v svoj računalnik: nekaj praktičnih nasvetov Kaj je Google Play Music</a></li> <li class='li1'><a href='https://ymol.ru/sl/instructions/kak-postavit-yandeks-startovoi-stranicei-kak-sdelat-yandeks-startovoi/' title='Kako narediti Yandex svojo začetno stran'>Kako narediti Yandex svojo začetno stran</a></li> <li class='li1'><a href='https://ymol.ru/sl/instructions/neobhodimo-obnovit-rasshirenie-fonts-pack-udalit-chrome-font-pack-vsplyvayushchee/' title='Odstranite paket pisav za Chrome (pojavno oglaševanje)'>Odstranite paket pisav za Chrome (pojavno oglaševanje)</a></li> <li class='li1'><a href='https://ymol.ru/sl/how-to-work/chto-nuzhno-sdelat-chtoby-kompyuter-ne-glyuchil-zavisaet-tormozit/' title='Zamrzne in upočasni računalnik'>Zamrzne in upočasni računalnik</a></li> <li class='li1'><a href='https://ymol.ru/sl/wi-fi/luchshie-programmy-dlya-upravleniya-drugim-kompyuterom-teamviewer-udalennoe/' title='TeamViewer: daljinski nadzor računalnika Nadzirajte svoje namizje na računalniku nekoga drugega'>TeamViewer: daljinski nadzor računalnika Nadzirajte svoje namizje na računalniku nekoga drugega</a></li> <li class='li1'><a href='https://ymol.ru/sl/problems/noutbuk-lenovo-thinkpad-t400s---silnyi-no-legkii-lenovo-thinkpad-t400s-podrobnye-tehnicheskie-hara/' title='Lenovo ThinkPad T400s Podrobne specifikacije prenosnikov Lenovo T400: brezžična zmogljivost'>Lenovo ThinkPad T400s Podrobne specifikacije prenosnikov Lenovo T400: brezžična zmogljivost</a></li> </ul> </aside> <aside id="wpforo_widget_recent_topics-2" class="widget widget_wpforo_widget_recent_topics"><div id="wpf-widget-recent-replies" class="wpforo-widget-wrap"><h3 class="widget-title">nova sporočila</h3><div class="wpforo-widget-content"><ul> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/58f0698fd0c654b90b7b7ec3ee9a40be.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/sl/choice/chto-delat-fonit-kak-sdelat-chtoby-ne-fonil-mikrofon-chto-delat/">Kako preprečiti hrup mikrofona</a></p> <p class="postuser">2024-03-08 04:04:04</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/0b96dd25149882eebdf7b87c51eb181a.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/sl/reviews/poshagovaya-instrukciya-podklyucheniya-routera-tp-link-proverennyi-sposob/">Preizkušen način za hitro nastavitev usmerjevalnika tp link - korak za korakom in v ruščini</a></p> <p class="postuser">2024-03-07 04:12:36</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/cdbfc27dfc5aecefecbd8296f8562c47.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/sl/overview/bezvozvratnoe-udalenie-failov-v-ccleaner-kak-steret-disk-navsegda/">Kako trajno izbrisati pogon: orodja CCleaner</a></p> <p class="postuser">2024-03-07 04:12:36</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/23fdeca60ff1dc541c21299c677550d3.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/sl/wi-fi/seo-prostym-yazykom-seo-dlya-nachinayushchih---osnovy-poiskovoi-optimizacii/">SEO za začetnike – Osnove optimizacije za iskalnike</a></p> <p class="postuser">2024-03-07 04:12:36</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/3312229def6ce5f6ca1579960fa4de4e.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/sl/choice/biografiya-xmlrpc-php-vvedenie-v-xml-rpc-otklyuchenie-xml-rpc-v-wordpress/">Biografija xmlrpc php. Uvod v XML-RPC. Onemogočanje XML-RPC v WordPressu</a></p> <p class="postuser">2024-03-07 04:12:36</p> </div> <div class="wpf-clear"></div> </div> </li> </ul></div></div></aside><aside id="categories-2" class="widget widget_categories"><h3 class="widget-title">kategorije</h3> <ul> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/bluetooth/">Bluetooth</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/wi-fi/">Wifi</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/choice/">Izbira</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/instructions/">Navodila</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/how-to-work/">Kako delati</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/setting/">nastavitve</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/beginning/">Začetek</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/overview/">Pregled</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/overview/">Pregled</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/sl/category/reviews/">Ocene</a> </li> </ul> </aside><aside id="dwqa-latest-question-2" class="widget widget_categories"><h3 class="widget-title">Novi članki</h3><ul> <li class="cat-item"><a href="https://ymol.ru/sl/how-to-work/shema-zapuska-binar-ot-pandora-3055-osobennosti-realizacii-avtozapuska/">Značilnosti izvedbe samodejnega zagona</a></li> <li class="cat-item"><a href="https://ymol.ru/sl/overview/chto-takoe-6-gb-ozu-operativnaya-pamyat-gigabaity-tipy/">RAM: gigabajti, vrste, hitrost in druge podrobnosti</a></li> <li class="cat-item"><a href="https://ymol.ru/sl/setting/na-materinskoi-plate-vyhod-lpt-chto-takoe-lpt-port-i-dlya-chego-on-nuzhen-rezhimy/">Kaj so vrata »LPT« in čemu so namenjena?</a></li> <li class="cat-item"><a href="https://ymol.ru/sl/overview/muzykalnaya-usb-klaviatura-k-kompyuteru-svoimi-rukami-izgotavlivaem/">Izdelava elektronskega klavirja iz tipkovnice MIDI z lastnimi rokami</a></li> <li class="cat-item"><a href="https://ymol.ru/sl/operation/wileyfox-swift---dostoinyi-smartfon-zadeshevo-obzor-wileyfox-swift-samyi-hitryi/">Pregled Wileyfox Swift - Najbolj zvit med proračunskimi uslužbenci Videz in enostavnost uporabe</a></li> <li class="cat-item"><a href="https://ymol.ru/sl/overview/nevidimye-znaki-formatirovaniya-v-microsoft-word-kak-sdelat/">Kako narediti nevidno ime?</a></li> <li class="cat-item"><a href="https://ymol.ru/sl/reviews/gde-luchshe-zhit-v-rossii-top-luchshih-gorodov-rossiiskoi-federacii-numerologiya-gorodov-besplatnyi-on/">Najboljša mesta Ruske federacije</a></li> <li class="cat-item"><a href="https://ymol.ru/sl/operation/smaily-i-ih-znacheniya-shokiruyushchaya-pravda-o-serdechkah-i-smailah/">Šokantna resnica o srčkih in emotikonih!</a></li> <li class="cat-item"><a href="https://ymol.ru/sl/how-to-work/novaya-mehanika-izmeneniya-vneshnego-vida-v-world-of-tanks-novaya/">Nova mehanika za spreminjanje videza v World of Tanks World of tanks spremeni pogled kamere</a></li> <li class="cat-item"><a href="https://ymol.ru/sl/reviews/gpmdp-desktopnyi-pleer-dlya-google-play-music-s-podderzhkoi-skrobblinga-i-goryachih/">Kako prenesti Google Play Music v svoj računalnik: nekaj praktičnih nasvetov Kaj je Google Play Music</a></li> </ul></aside></div> </div> </div> </div> <footer id="colophon" class="site-footer" role="contentinfo"> <div class="site-info container"> <div class="copyrights"> <span class="sep"> </span> ymol.ru - Vse o tabletah - Informacijski portal</div> <a href="#blog" class="toplink" ><i class="icon-angle-up"></i></a> <nav id="navigation" class="footer-navigation" role="navigation"> <div class="menu-footer-menu-container"><ul id="menu-footer-menu" class="menu"> <li class="menu-item type-post_type object-page "><a href="https://ymol.ru/sl/sitemap.xml">Zemljevid strani</a></li> <li class="menu-item type-post_type object-page "><a href="https://ymol.ru/sl/feedback/">Kontakti</a></li> </ul></div> </nav> </div> </footer> </div> <div id="vk_api_transport"></div> <script type="text/javascript"> jQuery(document).ready(function ($) { if ($('.social-likes')) { $('.social-likes').each(function () { var p = $(this).parent(); if (p.data('url')) { $(this).data({ 'url': p.data('url'), 'title': p.data('title') } ); } if ($(this).find('.pinterest').length) { if (p.data('media')) { $($(this).find('.pinterest')[0]).data({ 'media': p.data('media') } ); } else $($(this).find('.pinterest')[0]).remove(); } } ); $('.social-likes').socialLikes({ zeroes: 0 } ); } } ); </script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/akismet/_inc/form.js?ver=3.2'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/easy-vkontakte-connect/js/evc-share.js'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/easy-vkontakte-connect/js/social-likes.min.js?ver=3.0.4'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/contact-form-7/includes/js/jquery.form.min.js?ver=3.51.0-2014.06.20'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=4.5.1'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/wp-review/assets/js/main.js?ver=4.0.6'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/themes/sociallyviral/js/customscripts.js?ver=20120212'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js?ver=4.6.9'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=4.6.9'></script> <script>setTimeout( function(){ jQuery.post('/wp-content/plugins/kama-postviews/ajax-request.php',{ meta_id:'1438', view_type:'post_view', relpath:'' } ,function(result){ jQuery('.ajax_views').html(result); } );} , 2000);</script> <script>function lc_get_cookie(name) { var c = document.cookie;if (c.indexOf(name) != -1) { var x = c.indexOf(name)+name.length+1;var y = c.indexOf(";",x);if (y < 0) y = c.length;return decodeURIComponent(c.substring(x,y));} else return "";} if ((d = document.getElementById("commentform")) != null) { e = d.elements;var z = lc_get_cookie("comment_author_email_27b5a291828a105bf783f92a6d070718");if (z != "") e["email"].value = z;z = lc_get_cookie("comment_author_27b5a291828a105bf783f92a6d070718");if (z != "") e["author"].value = z.replace(/\+/g, " ");z = lc_get_cookie("comment_author_url_27b5a291828a105bf783f92a6d070718");if (z != "") e["url"].value = z;} </script></body></html>