Mulți programatori Delphi asociază setările de salvare cu utilizarea INI fișierele din programele dvs. Utilizarea acestei metode în proiecte mai puțin serioase ar trebui evitată, deoarece limitează flexibilitatea, ceea ce împiedică extinderea ulterioară a programului. Merită spus că această abordare este destul de populară datorită ușurinței sale de utilizare și disponibilității instrumentelor încorporate în mediul de dezvoltare.
Cu toate acestea, opțiunea ideală pentru stocarea setărilor programului este structurată XML fișiere. Avantajul lor este că este posibil ca numărul de parametri să nu fie fixat. Pentru a înțelege mai bine acest lucru, să ne uităm la un exemplu specific.
În programul USearch, când faceți clic pe o intrare, apare un meniu contextual, care afișează o listă de articole. Aceste elemente sunt comenzi, care la rândul lor sunt încărcate din fișierul de setări. Dacă setările au fost stocate în INI fișier, atunci programul ar putea salva și încărca un anumit număr de comenzi, de exemplu 10 sau 50. De îndată ce este nevoie de o valoare mai mare, codul va trebui rescris și recompilat corespunzător.
Folosind abordarea folosind XML fișiere, vom putea încărca dinamic toți parametrii secțiunii. Pe lângă toate acestea, fișierul de configurare va deveni mai elegant, fără numerotarea redundantă a parametrilor. Cu toate acestea, instrumente standard pentru a lucra XML Delphi are multe dezavantaje, așa că recomand să folosiți biblioteca standard MSXML. De obicei, este inclus în mod implicit în familia de sisteme de operare Windows.
Pentru a vă conecta MSXML, trebuie să generăm un fișier de interfață cu o listă a tuturor funcțiilor importându-l de pe serverul COM. Au fost scrise destul de multe articole detaliate despre cum să importați o interfață, dar vă sugerez să descărcați fișierul MSXML2_TLB.PAS deja gata de utilizare. După ce fișierul este descărcat, plasați-l lângă proiectul dvs. sau plasați-l în folderul lib al mediului Delphi. Astfel, toate programele create vor putea folosi modulul MSXML, trebuie doar să adăugați linia MSXML2_TLB la utilizări.
Pentru claritate, luați în considerare următorul exemplu de utilizare a acestei biblioteci:
Procedura LoadData; var XMLDoc: DOMDocument;
Rădăcină: IXMLDOMElement; începe XMLDoc:= CoDOMDocument.Create; XML XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("size/width").Text); Rădăcină:= zero; XMLDoc:= zero; Sfârşit;
. Apoi, conținutul dintre etichete este scos
, care la rândul lor sunt situate între etichete
. Astfel, din fișierul settings.xml, metoda noastră va afișa text în MessageBox
"100px"
500px
Aici este folosită metoda SelectSingleNode, care ia ca parametru un șir
După ce facem clic pe butonul Create Unit, va fi creat modulul de interfață MSXML_TLB, care ne va permite să folosim obiecte XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest și o serie de altele implementate în biblioteca MSXML.DLL. O referință la modulul MSXML_TLB trebuie să fie listată în lista Utilizări.
Document Object Model reprezintă un document XML ca o structură arborescentă constând din ramuri. Interfețele de programare XML DOM permit aplicațiilor să navigheze în arborele de documente și să manipuleze ramurile acestuia. Fiecare ramură poate avea un anumit tip (DOMNodeType), în funcție de care sunt determinate ramurile părinte și fii.
În majoritatea documentelor XML veți găsi ramuri precum element, atribut și text. Atributele sunt un tip special de ramură și nu sunt ramuri copil. Atributele sunt manipulate folosind metode speciale oferite de obiectele XML DOM.
Testați documentul XML
EMI
Document XML - obiect XMLDOMDocument
Pentru a controla modul în care este încărcat documentul (sincron sau asincron), utilizați proprietatea Async. În mod implicit, această proprietate este setată la True, ceea ce indică faptul că documentul este încărcat asincron și controlul este returnat aplicației înainte ca documentul să fie încărcat complet. În caz contrar, documentul este încărcat sincron, iar apoi trebuie să verificați valoarea proprietății ReadyState pentru a afla dacă documentul s-a încărcat sau nu. De asemenea, puteți crea un handler de evenimente OnReadyStateChange care va primi control atunci când valoarea proprietății ReadyState se schimbă.
Următoarele arată cum să încărcați un document XML utilizând metoda Load:
Utilizează ... MSXML_TLB ... procedura TForm1.Button1Click(Sender: TObject);
var XMLDoc: IXMLDOMDocument;
XMLDoc.Async:= False;
XMLDoc.Load('C:\DATA\DATA.xml');
// // Iată codul care manipulează // documentul XML și ramurile acestuia // XMLDoc:= Nil;<>Sfârşit;
Odată ce documentul este încărcat, putem accesa proprietățile acestuia. Astfel, proprietatea NodeName va conține valoarea #document, proprietatea NodeTypeString va conține documentul cu valoare, iar proprietatea URL va conține valoarea fișier:///C:/DATA/DATA.xml.
Gestionarea erorilor
... XMLDoc.Load('C:\DATA\DATA.xml');
XMLError:= XMLDoc.ParseError;<>Dacă XMLError.ErrorCode
0 Apoi // // Aici ne ocupăm de eroare // Else Memo1.Lines.Add(XMLDoc.XML);
După cum puteți vedea din exemplul de mai sus, informațiile returnate de obiectul XMLDOMParseError sunt destul de suficiente pentru a localiza eroarea și a înțelege motivul apariției acesteia.
Acum să restabilim elementul de închidere
Pentru a accesa un arbore de document, puteți fie să obțineți elementul rădăcină și apoi să iterați prin ramurile sale secundare, fie să găsiți o anumită ramură. În primul caz, obținem elementul rădăcină prin proprietatea DocumentElement, care returnează un obiect de tip XMLDOMNode. Următoarele arată cum să utilizați proprietatea DocumentElement pentru a obține conținutul fiecărui element copil:
Var Nod: IXMLDOMNode;
Rădăcină: IXMLDOMElement;
I: întreg;
... Root:= XMLDoc.DocumentElement;
Pentru I:= 0 la Root.ChildNodes.Length-1 face Begin Node:= Root.ChildNodes.Item[I];
Memo1.Lines.Add(Nod.Text);
Sfârşit;
Pentru documentul nostru XML vom obține următorul text.
Metoda NodeFromID necesită un identificator unic definit în Schema XML sau Definiția tipului de document (DTD) și returnează o ramură cu acel identificator.
Metoda GetElementByTagName necesită specificarea unui șir cu un anumit element (etichetă) și returnează toate ramurile cu acest element. Mai jos este cum să folosiți această metodă pentru a găsi toți artiștii din directorul nostru CD-ROM:
Noduri: IXMLDOMNodeList;
Pentru a accesa datele stocate într-o ramură, utilizați de obicei fie proprietatea NodeValue (disponibilă pentru atribute, ramuri de text, comentarii, instrucțiuni de procesare și secțiuni CDATA), proprietatea Text, care returnează conținutul text al ramurii, fie proprietatea NodeTypedValue . Acesta din urmă, însă, poate fi folosit doar pentru ramuri cu elemente tipizate.
Obiectul XMLDOMNode oferă multe modalități de a naviga în arborele documentului. De exemplu, pentru a accesa ramura părinte se folosește proprietatea ParentNode (tip XMLDOMNode), ramurile copil sunt accesate prin proprietățile ChildNodes (tip XMLDOMNodeList), FirstChild și LastChild (tip XMLDOMNode) etc.
Proprietatea OwnerDocument returnează un obiect de tip XMLDOMDocument care identifică documentul XML însuși. Proprietățile enumerate mai sus vă permit să navigați cu ușurință în arborele documentului.
Acum să trecem prin toate ramurile documentului XML:
Root:= XMLDoc.DocumentElement;
Pentru I:= 0 la Root.ChildNodes.Length-1 face Begin Node:= Root.ChildNodes.Item[I];
Dacă Node.HasChildNodes, atunci GetChilds(Node,0);
Sfârşit;
Să parcurgem procesul de utilizare a metodei SelectNodes pentru a prelua toate ramurile care au o ramură CD și o subramură PRICE:
Root:= XMLDoc.DocumentElement; Noduri:= Root.SelectNodes('CD/PRICE');
Toate sub-ramurile PRICE ale sucursalei CD vor fi plasate în colecția Nodes. Vom reveni la discuția despre șabloanele XSL puțin mai târziu.
Manipularea ramurilor copiilor
Var XMLDoc: IXMLDOMDocument;
Rădăcină: IXMLDOMNode;
XMLDoc:= CoDOMDocument.Create;
XMLDoc.Async:= False;
Var NewNode: IXMLDOMNode;
// Și setați valoarea Child.Text:= 'Pink Floyd';
Copil:= XMLDoc.CreateNode(1, 'ARTIST', '');
Am analizat deja utilizarea acestui obiect în exemplul dat în secțiunea „Navigarea în arborele documentelor”. Vă prezentăm aici câteva remarci teoretice.
Numărul de ramuri din listă poate fi obținut ca valoare a proprietății Length. Ramurile au indici de la 0 la Lungimea-1, iar fiecare ramură individuală este accesibilă prin elementul matrice Item cu indexul corespunzător.
Navigarea printr-o listă de ramuri se poate face și folosind metoda NextNode, care returnează următoarea ramură din listă, sau Nil dacă ramura curentă este ultima.
Crearea și salvarea documentelor
Până acum am analizat cum puteți adăuga ramuri și elemente la documentele XML existente.
Var XMLDoc: IXMLDOMDocument;
Rădăcină: IXMLDOMNode;
Nod: IXMLDOMNode;
S: WideString;
... S:= ‘
Când discutăm despre metoda SelectNodes a obiectului XMLDOMNode, am menționat că oferă o modalitate mai flexibilă de a accesa ramurile documentelor. Flexibilitatea constă în faptul că puteți specifica un șablon XSL ca criteriu de selectare a ramurilor. Astfel de șabloane oferă un mecanism puternic pentru căutarea informațiilor în documente XML. De exemplu, pentru a obține o listă cu toate titlurile CD-ROM-urilor muzicale din catalogul nostru, puteți rula următoarea interogare:
Pentru a afla ce discuri ale artiștilor au fost lansate în SUA, cererea se formează după cum urmează:
Noduri:= Root.SelectNodes('CD/ARTIST');
Următoarele arată cum să găsiți prima unitate din director:
Noduri:= Root.SelectNodes('CD/TITLE');
si ultimul:
Noduri:= Root.SelectNodes('CD/TITLE');
Pentru a găsi CD-uri Bob Dylan, puteți rula următoarea interogare:
Noduri:= Root.SelectNodes(‘CD[$any$ ARTIST= ”Bob Dylan”]/TITLE’);
și pentru a obține o listă de discuri lansate după 1985, rulăm următoarea interogare:
Noduri:= Root.SelectNodes('CD/TITLE');
O discuție mai detaliată despre sintaxa XSL necesită o postare separată. Pentru a intriga cititorii și pentru a încuraja cercetările ulterioare, voi da doar un mic exemplu de posibile utilizări ale XSL. Să presupunem că trebuie să ne transformăm catalogul într-un tabel HTML obișnuit. Folosind metode tradiționale, trebuie să trecem prin toate ramurile arborelui și să formăm etichetele corespunzătoare pentru fiecare element primit.
Folosind XSL, pur și simplu creăm un șablon (sau o foaie de stil) în care indicăm ce trebuie convertit și cum. Apoi suprapunem acest șablon pe directorul nostru - și am terminat: avem textul unui șablon XSL care convertește directorul într-un tabel (Listing 2).
Codul pentru suprapunerea șablonului XSL în directorul nostru arată astfel:
Procedura TForm1.Button2Click(Expeditor: TObject);
var XSLDoc: IXMLDOMDocument;
XSLDoc.Load('C:\DATA\DATA.xsl');
Memo2.Text:= XMLDoc.TransformNode(XSLDoc);
XSLDoc:= Nil;
Delphi este al doilea cel mai important limbaj de programare cu care studenții sunt cel mai des introduși în timpul studiilor. Acesta este începutul învățării programarii orientate pe obiecte. Ca student, am ajuns la concluzia că nu există o modalitate mai ușoară de a stăpâni o limbă decât de a scrie un calculator în ea. Chiar dacă implementați o funcție de bază pentru adăugarea a două numere, aceasta va pune în lumină multe.
CodeGaear, Delphi 7, Lazarus sunt compilatoare diferite, programe care vor transfera codul pe care îl scrieți pe mașină, transformându-l în zerouri și unu. Acestea sunt toate programe pentru crearea de programe, nu limbaje de programare separate. Aceste compilatoare folosesc limbajul de programare Object Pascal, care este baza limbajului Delphi, care este similar ca sintaxă cu Pascal obișnuit, dar diferă semnificativ din punct de vedere funcțional.
Acesta este formatul pentru scrierea diferiților operatori. De exemplu, o buclă „for” în Pascal are următorul format: „for n:=1 to k do”, etc.
În limbajul de programare C++, același ciclu este scris ușor diferit: pentru (n = 1; n Scriem un calculator
Acest lucru vă va oferi o înțelegere a modului în care obiectele interacționează cu codul programului, ce sunt „variabilele” și cum funcționează funcțiile matematice. Orice programare va fi un calcul în orice caz. Un joc este și un program care calculează constant ceva, funcționează cu numere și funcții numerice. Programarea este inseparabilă de matematică.
Vom folosi mediul de dezvoltare Lazarus pentru scriere. Funcționalitatea sa nu este la fel de bogată ca, de exemplu, CodeGear, dar este disponibilă gratuit și este destinată învățării.
Deschizând mediul de dezvoltare, vedem un formular și o bară de instrumente. Iată formularul.
Aici este panoul cu elemente.
Primul lucru pe care îl vom face este să adăugăm cele trei elemente de care avem nevoie pentru a implementa funcția de a adăuga două numere. Aveți nevoie de: „Tedit” în cantitate de trei bucăți și „TButton”. În imaginea de mai jos sunt afișate în panoul cu săgeți. Facem clic pe ele o dată, apoi o dată pe formular și apar pe el.
Acestea sunt câmpuri de introducere a textului și un buton obișnuit. Întâlnești aceste elemente atunci când folosești aproape orice program Windows. Aruncă o privire.
Acum să ștergem aceste inscripții. Faceți clic pe fila Vizualizare. Și faceți clic pe „Inspector de obiecte”. Va apărea o fereastră ca aceasta.
Facem clic o dată pe elementul nostru „Button” din formular și schimbăm valoarea „Caption” din fereastra de inspector cu oricare alta. De exemplu, cuvântul „Ok”. Apăsați Enter. Vedem pe formular cum elementul și-a schimbat numele.
Vom face același lucru cu Editările, dar nu le vom redenumi, ci le vom face fără niciun conținut. Selectați-le unul câte unul și ștergeți valoarea Text din inspector. Nu uitați să apăsați Enter.
Drept urmare, forma noastră arată astfel.
Acum, pentru ca calculatorul nostru să funcționeze, trebuie să scriem codul de program necesar pentru procedura butonului nostru. Faceți dublu clic pe elementul Button și deschideți editorul de cod sursă.
vezi? Butonul de procedură1Clic. Aceasta este o procedură care este responsabilă pentru ceea ce se va întâmpla atunci când apăsăm butonul o dată. Și ar trebui să se întâmple următoarele: programul trebuie să afișeze în a treia Editare suma numerelor introduse în primele două câmpuri. Scriem cod.
Trebuie să scriem atât de simple 5 linii de cod. Comentariile și explicațiile sunt vizibile în imaginea de mai sus. După aceea, faceți clic pe acest buton.
Proiectul nostru va fi compilat. Va fi compilat într-un program. Introducem numerele în primele două câmpuri, facem clic pe buton și obținem valoarea sumei.
Puteți face clic pe butonul „Fișier”, apoi pe „Salvați tot”, selectați un folder de salvat și veți avea un program complet care poate fi lansat de pe desktop. Acum încercați să vă dați seama singur ce trebuie rescris în acest cod, astfel încât programul să împartă două numere în loc să le adauge. Sugestie: trebuie să schimbați tipul de date. Videoclipul de mai jos arată un exemplu similar, dar în Delphi 7, nu în Lazăr.
Recent, s-a acordat multă atenție construirii de sisteme de e-business, sau așa cum sunt numite și - B2B (business to business). Ținând cont de recomandările pentru construirea sistemelor de schimb streaming ale organismului coordonator de tehnologii Internet - Consorțiul WWW: se pune accent pe tehnologiile XML și construcția sistemelor de schimb de documente XML.
Avantajul utilizării XML în afacerile electronice este eficiența ridicată a sistemelor B2B la costuri reduse ale creării acestuia datorită unei prezentări clare și vizuale a informațiilor structurate, capacității de a utiliza protocoale de rețea moderne și de a crea sisteme de afaceri în timp real.
Independența prezentării informațiilor sub formă de documente XML permite diferitelor companii care participă la afaceri electronice să producă software independent unul de celălalt.
În toate sistemele, schimbul este de obicei construit după aceeași schemă, folosind cereri HTTP. Protocolul SSL este folosit ca protocol de securitate a informațiilor (dar acesta este un subiect separat).
Una dintre opțiunile posibile pentru procesarea mesajelor XML este construirea de aplicații BIN/CGI (ISAPI) sau componente COM (server) care generează sau procesează documente XML.
Pe de o parte, aplicația acționează ca un client care emite o cerere HTTP în modul POST, pe de altă parte, există un server WEB pe partea căruia este procesată cererea și este emis răspunsul. Documentele XML sunt folosite în schimbul de informații.
Una dintre cele mai eficiente opțiuni de implementare este utilizarea unui parser XML existent care acceptă modelul DOM. Acest parser este un pachet de distribuție al Win`98 sau o componentă a IE 4.7 și o versiune ulterioară (pentru Win`95) și reprezintă un server COM situat în biblioteca msxml.dll.
Component Object Model (COM) - reprezintă date și metode încapsulate într-o singură entitate și o modalitate de a le accesa printr-un sistem de interfețe. Folosind Delphi, este destul de ușor să accesați clasele unui obiect COM (mai multe clase pot fi incluse într-un server COM). Obiectele sunt accesate prin inițializarea unei instanțe a clasei printr-un sistem de interfețe. Descrierea interfețelor este realizată de Interface Definition Language (IDL), care se poate face automat folosind mediul.
Instrumente Delphi de import de pe un server COM msxml.dll, sunt construite fișiere de descriere a interfeței IDL și un fișier de descriere binar de tipuri de biblioteci - TLB -. Această operațiune se realizează prin meniul de sistem: Proiect | Tip Biblioteca Import:(Figura 1). În continuare, apare o casetă de dialog (Figura 2), în care trebuie să selectați un obiect COM (în cazul nostru, obiectul este înregistrat sub numele „Microsoft.XMLDom (Versiunea 2.0)”) și să creați un fișier TLB (buton Creați o unitate). Folosind fișierul TLB, mediul generează un fișier de descriere a serverului COM „Pascal” - MSXML_TLB.pas
Fișierul MSXML_TLB.pas descrie toate interfețele, constantele și co-clasele serverului COM.
Pentru a accesa obiectele elementului COM, este necesar în directivă UTILIZĂRI adăugați numele fișierului de descriere a bibliotecii (MSXML_TLB.pas). Mai jos este un program simplu care utilizează analizatorul standard DOM msxml.dll, care încarcă un document XML și îl afișează în elementul câmp de text Memo1.
utilizări Windows, Mesaje, SysUtils, Clase, Grafică, Controale, Formulare, Dialoguri, OleServer, MSXML_TLB, StdCtrls; tip TForm1 = clasă(TForm)Button1: TButton; Memo1: TMemo; procedură Button1Click(Expeditor: TObject); Sfârşit; var Form1: TForm1; implementare ($R *.DFM) Procedură // declararea unei coclase a obiectului DOMDocument; Sfârşit; coDoc: CoDOMDocument; // clasa compatibilă cu interfața IDOMDocument; Sfârşit; Doc: IXMLDOMDocument; ÎNCEPE // crearea unei instanțe a unui obiect DOMDocument; Doc:= coDoc.Create; // apelarea metodei Load a unei instanțe de obiect DOMDocument; Doc.load("data.xml"); // acces la proprietatea xml a instanței obiectului DOMDocument; Memo1.Text:=Doc.xml; Sfârşit; Sfârşit.Fiecare document XML este reprezentat ca un set de mai multe obiecte (clase), cu ajutorul cărora este posibil accesul la elemente individuale (câmpuri obiect). DOM - interfața descrie accesul atât la obiecte simple de tip DOMString sau CharacterData, cât și la părți sau elemente individuale ale unui document XML: DOMFragmentElement, DOMNode, DOMElement.
Mai jos sunt cele mai importante proprietăți și metode ale obiectelor XMLDOMNode, XMLDOMNode, XMLDOMNodeList. Trebuie remarcat faptul că metodele și funcțiile obiectelor DOM (Document Object Model) prezentate mai jos sunt utilizate de analizatorul Microsoft XML msxml.dll și sunt ceva mai largi decât modelul DOM aprobat de Consorțiul W3C.
O descriere mai completă a interfeței obiect DOM poate fi găsită la
Obiect XMLDOMDocument | |
Reprezintă nivelul superior al ierarhiei obiectelor și conține metode de lucru cu un document: încărcarea acestuia, analizarea acestuia, crearea de elemente, atribute, comentarii în el etc. . | |
Proprietăți | |
Async | Proprietate care identifică modul curent de procesare |
ParseError | Returnează o referință la obiectul de tratare a erorilor XMLDOMParseError |
Activează - dezactivează verificarea documentelor. | |
url | Returnează adresa URL a documentului |
documentElement | Conține o referință la elementul rădăcină al documentului ca obiect XMLDOMElement. |
Metode | |
încărcare(url) loadXML(xmlString) |
Încarcă un document XML, |
salvare(objTarget) | Salvează un document XML într-un fișier |
avort | Întreruperea procesului de încărcare și procesare a documentelor. |
createAtribute(nume) | Creează un nou atribut cu numele specificat pentru elementul curent. |
createNode(Tip, nume, nameSpaceURI) | Creează un nod de tipul și numele specificate |
createElement(etichetăNume) | Creează un element de document cu numele specificat. |
createTextNode(date) | Creează text în interiorul unui document |
getElementsByTagName(nume etichetă) | Returnează o referință la o colecție de elemente de document cu numele dat |
nodeFromID(idString) | Căutarea unui element după ID |
Obiect XMLDOMNode | |
Un obiect XMLDOMNode care implementează interfața de bază DOM Nodul, este destinat manipulării unui singur nod al arborelui documentului. Proprietățile și metodele sale vă permit să obțineți și să modificați informații complete despre nodul curent - tipul acestuia, numele, numele complet, conținutul său, lista de elemente copil etc. | |
Proprietăți | |
nodeName, bazăName | Returnează numele nodului curent. |
prefix | Returnează prefixul Namespace. |
dataType | Determină tipul de conținut al nodului curent |
nodeType, nodeTypeString | Returnează tipul nodului curent: |
atribute | Returnează o listă de atribute ale nodului curent ca o colecție de XMLDOMNamedNodeMap. |
text | Returnează conținutul subarborescului curent ca text |
xml | Returnează o reprezentare XML a subarborelui curent. |
nodeValue | Returnează conținutul nodului curent. |
childNodes | Returnează o listă de elemente copil ca XMLDOMNodeList. |
primulCopil, ultimulCopil | Returnează primul/ultimul element copil |
precedentul frate ,nextFrate | Returnează elementul frate anterior/următorul. |
parentNode | Conține un link către elementul părinte. |
proprietarDocument | Returnează un pointer către documentul în care se află nodul curent. |
Metode | |
appendChild(newChild) | Adaugă un nou element copil la nodul curent. |
insertBefore(newChild, refChild) | Inserează un nod copil, poziționându-l în subarborele curent „în stânga” nodului specificat de parametrul refChild. |
cloneNode(adânc) | Creați o copie a elementului curent. |
getAttribute(nume) getAttributeNode(nume) setAttribute(nume, valoare) setAttributeNode(XMLDOAtribut) |
Acces la atributele (crearea, citirea, scrierea) unui obiect. Nume este numele atributului, valoarea este valoarea acestuia. Returnează valoarea unui obiect XMLDOMAttribute. |
replaceChild(newChild, oldChild) removeChild(oldChild) | Înlocuiește obiectul oldChild din lista curentă de obiecte copil cu newChild. Ștergerea obiectului oldChild |
selectNodes(patternString) selectSingleNode(patternString) | Returnează obiectul XMLDOMNodeList selectat de modelul de căutare sau de primul nod |
transformNode(foaia de stil) transformNodeToObject(foaia de stil, outputObject) |
Atribuie o foaie de stil subarborelului nodului curent și returnează un șir - rezultatul procesării. O referință la obiectul DOMDocument care conține instrucțiuni XSL este transmisă ca parametru. |
Pentru o imagine mai clară, este nevoie de o explicație cu privire la motivul pentru care toate acestea sunt necesare pentru a înțelege cum funcționează:
La construirea unui sistem ERP B2B sau corporativ, la organizarea schimbului de informații de documente XML între întreprinderi sau sucursale ale unei companii, se utilizează un sistem de transfer de informații efectiv dovedit, bazat pe serverele WEB existente prin protocoale HTTP.
Pe de o parte, aplicația acționează ca un client, care emite o cerere HTTP în modul POST, pe de altă parte, există un server WEB, pe a cărui parte se procesează cererea și se emite răspunsul; Documentele XML sunt folosite ca schimb.
De exemplu, într-un sistem ERP corporativ simplu, un program de contabilitate (ASU Bukhuchet) trebuie să genereze o anumită solicitare pentru emiterea unei facturi și să o transfere la o sucursală care are un depozit (ASU Warehouse). AWP O formulare similară a problemei la crearea unui sistem B2B, când Întreprinderea A solicită disponibilitatea produselor (place o comandă de achiziție) de la Furnizorul B.
Enterprise A și programul său acționează ca un client. Depozitul este întreținut de furnizorul B, care are un complex de baze de date de depozit pe un server SQL. Schimbul se realizează prin serverul WEB corporativ al Furnizorului B.
Următorul algoritm tipic de schimb este prezentat mai jos:
Regula generală pentru dezvoltarea unui sistem de schimb de documente XML este:
Fiecare document XML, ca un document HTML, trebuie să fie format dintr-un antet de mesaj (informații incluse în etichete) și un corp de mesaj (pentru o solicitare, aceste informații sunt incluse în etichete pentru a răspunde cererii). Pentru ca documentul XML să fie format corect, este necesar să încadrezi cele două componente ale sale „Header” și „Request” cu etichete, de exemplu. Tipul de document standard este prezentat mai jos:
Antetul (Figura 4), spre deosebire de un document HTML, trebuie să conțină diferite tipuri de informații de serviciu, inclusiv informații despre tipul de document care este transmis și procesul de prelucrare a acestuia. Corpul documentului intră în procesarea informațiilor, i.e. conținut încadrat cu etichete. Trebuie remarcat faptul că structura titlurilor trebuie să fie aceeași pentru toate tipurile de documente.
Pentru un Proces lansat de server, algoritmul de procesare este de preferință (dar nu neapărat) construit după cum urmează:
După cum sa explicat deja, atunci când se creează un document XML, se utilizează reprezentarea acestuia sub forma unui model DOM. Mai jos este un exemplu de parte a textului Delphi al programului pentru crearea unui antet de mesaj xml.
Memo1: TMemo; TThread1.HeaderCreate(Expeditor: Tobject); Sfârşit; // declarația unei coclase, necesară pentru a crea coDoc: CoDomDocument; // Obiect XMLDomDocument Doc: DomDocument; ÎNCEPE r: IXMLDOMElement; Nod: IXMLDOMElement; // DOMText txt: IXMLDOMText;// DOMAttribute attr: IXMLDOMAttribute;De remarcat faptul că declararea variabilei coDoc: CoDomDocument și Doc: DomDocument , precum și crearea acesteia prin metoda Create (Doc:=coDoc.Create;) se realizează o singură dată. Declarația variabilei este situată în secțiunea de declarare a variabilelor globale și nu în procedura locală, așa cum a fost demonstrat pentru claritate în acest exemplu (adică, o variabilă globală de tip DomDocument per modul de program).
Rezultatul programului de mai sus va fi antetul creat, în raport cu exemplul nostru de document xml: prezentat în Figura 5.
Figura 6.
Principalul avantaj al transmiterii de informații sub formă de documente XML este că este posibil să se genereze un mesaj folosind structuri de tabel independente în DBMS atât pe partea de recepție, cât și pe cea de transmisie. Folosind exemplul nostru, să presupunem că trebuie să transferăm informații despre facturile întreprinderii A dintr-un SGBD având structura prezentată în Figura 6
Pentru a genera un document xml care conține o factură, o interogare SQL (interogarea A) este creată inițial cu informații despre factura în sine:
SELECTA* DIN Factura_General UNDE InvoiceNum = :num SELECTA Bunuri, Calitate, Pret, HZ_cod DIN Bunuri UNDE InvoiceNum = :num // :num - parametru care specifică numărul facturii.Mai jos este o parte a programului care formează corpul documentului xml:
Memo1: TMemo; TThread1.DataBodyCreate(Expeditor: Tobject); Sfârşit; // declararea unei coclase și a unui obiect XMLDomDocument//coDoc: CoDomDocument ; // trebuie să fie global pentru întregul modul.//Doc: DomDocument ; // declararea obiectelor DOMElement r: IXMLDOMElement; // DOMElement; Nod, Node2: IXMLDOMElement; Nodul 3, Nodul 4: IXMLDOMElement; // DOMText txt: IXMLDOMText; str: String; ÎNCEPE// InvoiceNumber: întreg;- variabilă globală - // are valoarea 987654 // interogareA, interogareB: Şir;- variabila globala, // are o valoare corespunzatoare cererii // interogareA - solicitare A informatii generale despre factura // interogareB - solicitare B informatii despre marfa descrisa in // factura (vezi text) Interogare.Închidere;// vezi textul "interogare A" Interogare.Text:= interogareA;// execută cererea Query.ExecSQL; Interogare.Deschidere; // obținerea adresei elementului rădăcină r:=Doc.Get_documentElement; Interogare.Text:= interogareA; Node2:= Doc.createElement("Solicitare"); // obținerea adresei elementului rădăcină// creează DOMElement (etichetă) Nod:= Doc.createElement("Factură");// adăugarea unui element la rădăcină // crearea unui nod text = valoarea câmpului// atribuirea unei valori nodului // nod text, variabila str SRL „Taifun” // operații similare pentru etichetăNode.appendChild(txt);
... // operații similare pentru etichete:
Memo1: TMemo; Ca rezultat al acestei proceduri, este generat următorul text al documentului XML:IXMLHttpRequest
Open(const bstrMethod, - metoda tip ="POST" bstrUrl, - adresa server URL varAsync, - mod de comunicare asincron/sincron = true bstrUser, - nume de utilizator pentru autentificare bstrPassword) - parola
Memo1: TMemo; Crearea unei părți server de procesare a documentelor Sfârşit; După cum sa menționat mai devreme, procesarea cererilor HTTP poate fi efectuată fie de aplicații CGI, fie de servlet-uri Java. De asemenea, este posibil să scrieți pagini ASP. Dar în acest caz, transferul de date este posibil numai folosind metoda „GET” printr-un șir de interogare. Deși, procesarea solicitărilor HTTP pentru paginile ASP este mai eficientă decât pentru o aplicație CGI. Cu toate acestea, în opinia mea, nu are nicio diferență cum să procesezi, dar ceea ce este mai important este să rezolvi întrebarea - cum să construiești un program de procesare și nu prin ce mijloace. Dacă din capitolul anterior ne-am uitat la opțiunile de generare a unui document XML, atunci sarcina aplicației server este invers - analizarea documentelor XML. Mai jos este o parte a programului care analizează documentul xml: Tthread1.DataParser(Expeditor: Tobject);// declararea obiectelor DOMElement r,FNode: IXMLDOMElement; XMLDoc, XSLDoc, ResultDoc: DomDocument ; // HttpStr: String; - variabila globala care contine sirul de solicitare HTTP ÎNCEPE XMLDoc:=coDocXML.Create; Interogare.Închidere; XMLDoc.LoadXML(HttpStr); r:=Doc.Get_documentElement;// obținerea valorii elementului FNode:= r.SelectSingleNode("//TypeDocument");// obținerea valorii atributului id="Comandă" FileName:= FNode.GetAttibute("id");// și formând numele de fișier Order.xsl FileName:= FileName+".xsl";// creează un document XSLDoc XSLDoc:=coDocXSL.Create; XSLDoc.LoadXML(FileName); // creează un document XMLDoc ResultDoc:=coDocResult.Create; // setarea modului de procesare sincronă ResultDoc.Set_async(false); // setează verificarea analizei ResultDoc.validateOnParse:= adevărat; // analizează XMLDoc folosind un șablon XSL XMLDoc.transformNodeToObject(XSLDoc, ResultDoc);// variabilei Str i se atribuie o valoare text // documentul rezultat. Str:= ResultDoc.text; // caută element FNode:= r.SelectSingleNode("//InvoiceNumber"); // închide cererea de acces// și obținerea valorii elementului parm:= FNode.text; Interogare.Închidere; Şir; Interogare.Text:= Str; Sfârşit;// atribuirea unei valori parametru
Query.Params.AsString:= parm;
Avantajul utilizării analizei printr-un șablon este că datele sunt oarecum flexibile, iar funcționarea algoritmului este complet independentă de codul programului. Mai jos este textul șablonului XSL utilizat pentru a procesa un document COMANDĂ:
INSERT în TABREG (FROM, TO, TYPEDOC,body) VALUES(" INSERT in GOODS (invoiceNumber, name, price, quality) VALUES(" :num", " Explicând exemplul de mai sus, trebuie remarcat faptul că utilizarea unei perechi de etichete este de natură formală, deoarece după parsare, documentul XML rezultat trebuie să conțină în mod formal cel puțin un nod. Metoda ResultDoc.text atribuie valoarea textului documentului XML ResultDoc obținut în timpul parsării. În acest caz, valoarea este tot ceea ce este încadrat de o pereche de etichete și, i.e. Interogarea SQL pe care am generat-o.
Abrevierea XSL provine de la eXtensible Stylesheet Language - un limbaj pentru formatarea foilor de stil (date XML). După cum sugerează titlul, eXtensible Stylesheet Language (XSL) este folosit pentru a formata datele XML. După definiția W3C, XSL constă din două părți:
Folosind XSLT, putem selecta datele de care avem nevoie dintr-un fișier XML și le putem aranja într-un formular pentru prezentare către utilizator. De exemplu, în cazul nostru, am convertit datele XML într-o interogare SQL. Utilizarea clasică a XSL este, de regulă, formatarea datelor sub formă de pagini HTML sau, mai rar, sub formă de fișiere RTF.
Fișierul XSL descrie șablonul după care vor fi convertite datele XML. Revenind la șabloanele xsl, următoarele elemente (directive) pot fi distinse în XSLT:
directive XSL | descriere |
---|---|
xsl:apply-templates | Directiva care indică aplicarea șabloanelor corespunzătoare atributului select="nume șablon". |
xsl:atribut | creează un arbore de atribute și îl adaugă la elementul de ieșire, parametru nume="nume atribut", spațiu de nume - URI la spațiul de nume (prefixul spațiului de nume) |
xsl:call-template | apelează șablonul, attribute name="URI la șablon" |
xsl: alege xsl:când xsl: altfel |
făcând o selecție bazată pe xsl:when expr="evaluarea unei expresii într-un script", limba="nume-limbă" test= „expresie evaluată” |
xsl:comentare | generează un comentariu în documentul de ieșire |
xsl:copie xsl:copy-of |
copiează nodul curent în sursa de ieșire sau lipește un fragment de document în nodul unde atributul select = „numele nodului sursă” |
xsl:element | creează un element de ieșire după nume, atribut name="nume element", namespace="uri namespace reference" |
xsl:pentru-fiecare | reaplică șablonul tuturor nodurilor din lista de noduri, atributul select specifică lista de noduri |
xsl:daca | verificarea condiției, specificată de atributul test ca expresie |
xsl:include | include șablon extern, atributul href = „URI de referință”. |
xsl:ieșire | specifică rezultatul de ieșire, atributul metodei poate avea valorile „xml”, „html” sau „text” |
xsl:param | specifică valoarea parametrilor, attribute name="nume parametru", select = "valoare" |
xsl:instrucțiune-procesare | creează o instrucțiune de procesare, attribute name="nume instrucțiune de proces" |
xsl:sort | sortează mai multe noduri, atribute select = „nume nod”, tip de date = tip de date („text” | „număr” | Qname), ordine = direcție de sortare („crescător” | „descendent”) |
xsl:foaie de stil | definește un document șablon xsl, este elementul rădăcină pentru XSLT |
xsl:template | definește un șablon xsl, nume atribut= „prefix URI la numele șablonului”, match= „indicație a nodului la care este aplicat șablonul” |
xsl:text | generează text în fluxul de ieșire, atributul disable-output-escape = „da” sau „nu”, indică capacitatea de a genera caractere ESC |
xsl:value-of | inserează valoarea nodului selectat ca text, atributul select = „pointer to node” din care este luată valoarea |
xsl:variabilă | specifică valoarea limitelor variabilei, numele atributului = „numele variabilei”, select = „calculul valorii variabilei” |
xsl:cu-param | aplică un parametru unui șablon, atribut nume = „nume parametru”, selectează = expresie pentru a evalua contextul curent, valoarea implicită „.” |
În cele din urmă, trebuie remarcat faptul că utilizarea unui parser XML standard msxml.dll nu este singurul instrument pentru analizarea și crearea de documente XML. De exemplu, pentru a crea documente XML este eficient să folosiți componente TPageProduserŞi TTableProduser. Dar, acest articol subliniază doar amploarea și posibilitatea utilizării modelului DOM în practică.
Autorul va fi foarte recunoscător pentru feedback-ul cu privire la relevanța subiectului, conținutul general, stilul de prezentare, precum și pentru toate celelalte comentarii care vor ajuta la îmbunătățirea în continuare a calității scrierii unei colecții de articole și a lansării unei cărți care acoperă subiectul latura practică a utilizării documentelor XML în comerțul electronic. Informații mai detaliate despre latura practică a utilizării documentelor electronice pot fi găsite pe site-ul web al autorului www.eDocs.al.ru. Este, de asemenea, planificată să posteze texte sursă și exemple pe site-ul web al autorului.
Bun venit! Acest blog este dedicat internetului și computerelor, sau mai degrabă a fost dedicat acestora.
Probabil că este imediat evident că nu au apărut articole noi pe site de mulți ani. Da, aceasta este soarta majorității blogurilor. Acest proiect a fost cândva o întreprindere ambițioasă, iar autorul, la fel ca mulți alții care scriau la acea vreme, avea planuri ambițioase de a deveni unul dintre cei mai buni bloggeri ruși. Ei bine, dacă te uiți acum, dintre acele bloguri care au fost create simultan cu ale mele, majoritatea au dispărut deja în eternitate. Și pur și simplu nu am avut suficient timp să scriu pe blog. Deci da, nu mai este actualizat. Deși am câștigat odată competiția „Runet Blog 2011” cu acest site.
Chiar mi-a venit ideea să șterg toate acestea, dar apoi am trecut în revistă materialele vechi și mi-am dat seama că ele pot fi în continuare utile cititorilor. Da, unele articole sunt depășite (dacă am suficientă putere, vor fi marcate în consecință), dar site-ul, de exemplu, poate fi util pentru începători - aici puteți citi despre conceptele de bază ale internetului, aflați cum să configurați Internet, Windows sau chiar decideți să treceți la Linux. Așa că uită-te la categorii și alege-o pe cea care ți se potrivește.
Și totuși, sper că acesta este mai mult decât un blog, ci un adevărat ghid pentru Internet. Site-ul poate fi vizualizat în modul director, unde toate articolele disponibile sunt structurate pe categorii. Și, cine știe, poate într-o zi vor începe să apară aici articole noi de înaltă calitate.
Sander
Picodi.ru este un portal de reduceri de la International Coupons, un expert polonez în domeniul economiilor și al cumpărăturilor ieftine. Polonezii sunt considerați una dintre cele mai frugale națiuni din lume, așa că nu este surprinzător că acest tip de proiect a apărut din startup-ul polonez kodyrabatowe.pl. Cum poate acest portal să fie util utilizatorului mediu de internet din Rusia?
Telefoanele moderne Android sunt mai mult decât simple telefoane. Te obișnuiești cu setul de programe instalate, istoricul apelurilor și mesajelor text, colecția ta de fotografii și multe altele. Dar timpul trece, iar dispozitivul de care ați fost complet mulțumit începe să încetinească, să se defecteze sau pur și simplu își pierde aspectul prezentabil din cauza cipurilor de pe corp sau a zgârieturilor de pe ecran. Se pune întrebarea de a alege un nou telefon și de a schimba telefonul Android. Și dacă ignorăm problema alegerii pentru moment, atunci „mutarea” la un nou telefon rămâne o problemă serioasă - nu doriți să începeți toate datele de la zero. Despre asta vom vorbi astăzi.
Cei mai mulți dintre cititorii acestui blog, cel mai probabil, nu au întâlnit niciodată sisteme de control al versiunilor și nu le vor întâlni în viitorul apropiat. E păcat. Această invenție extrem de convenabilă este destul de folosită de programatori, dar, în opinia mea, ar putea fi foarte utilă și pentru cei care lucrează activ cu texte. Dar, probabil, acum nu există un singur sistem de control al versiunii care ar fi ușor de utilizat pentru lucrul „de birou” (Microsoft Office). Cu toate acestea, cred că materialul prezentat în articol poate fi de interes pentru toți cititorii.
Dacă v-ați întrebat cum să vizionați filme online și să accesați internetul de pe televizor, acest articol este pentru dvs. Nu, știu că unele televizoare au deja funcționalitate Smart TV, dar nu am văzut niciodată că funcționează corect. Aparent, acesta este motivul pentru care Google a demonstrat recent un dispozitiv absolut uimitor care a devenit imediat o senzație. Vorbim despre streamerul media Chromecast, o versiune mai avansată și mai accesibilă a playerului dezastruos Nexus Q de anul trecut.
Dongle-ul Chromecast, ale cărui dimensiuni nu depășesc 2 inci, se conectează la portul HDMI al televizorului și vă permite să vă bucurați de vizionarea conținutului web în flux. Pentru a controla streamer-ul, puteți utiliza orice dispozitiv (tabletă, PC, smartphone) bazat pe platforma de operare iOS, Windows, Android sau Mac OS.
Acest articol este dedicat proiectării memoriei sistemului Android, problemelor care pot apărea din cauza lipsei acesteia și modalităților de a le rezolva. Nu cu mult timp în urmă, eu însumi m-am confruntat cu faptul că telefonul meu Android a început să afișeze în mod regulat mesaje despre memorie scăzută atunci când am încercat să instalez cutare sau cutare aplicație. Ceea ce a fost foarte ciudat pentru mine, avand in vedere ca conform descrierii de pe piata ar fi trebuit sa fie vreo 16GB, si am crescut si acest volum folosind un card de memorie suplimentar. Cu toate acestea, a existat o problemă și a fost nevoie de multă zguduială înainte să găsesc soluția potrivită care nu necesita acces la root sau restabilirea completă a telefonului la starea din fabrică.