Descrierea structurii unui document XML folosind DTD – Document Type Definition. Introducere în XML DTD

Cheat sheet pe DTD .

DTD – Una dintre modalitățile de a descrie formal aspectul documentului XML , realizat într-un limbaj ușor de înțeles pentru programul de analiză.

În prezent timpul curge refuzul de utilizare DTD in favoarea XSD (Definiția Schemei XML ), pentru cateva motive:

  • DTD utilizări diferite de XML sintaxă.
  • Nu există tastare de nod.
  • Nu există suport pentru spațiile de nume.

Cu toate acestea, această metodă este încă utilizată pe scară largă, deoarece este mai simplă și mai convenabilă pentru a descrie aspecte simple ale documentelor.

CONSTRUCȚII DTD

Descrierea schemei constă din declarații de markup ( declarație de markup ), începând cu o pereche de caractere „ ” urmat de unul dintre cuvintele:

  • ELEMENT (indică faptul că este anunțat element )
  • ATTLIST (lista de atribute )
  • ENTITATE (esență )
  • NOTAŢIE (desemnare )

declarația de markup se termină cu „ >

DECLARAȚIE DE TIP ELEMENT

(trebuie descris fiecare element al documentului)

Conţinut:

  • GOL – gol (de exemplu
    )
  • ORICE - orice conținut (rar)
  • (#PCDATA) – numai date de caractere
  • (lista de nume ale elementelor imbricate separate prin virgule) – elementele imbricate trebuie să apară în document în ordinea în care sunt enumerate în declarație. Este declarat un singur nivel de cuibărit. Elementele pot fi grupate folosind paranteze.
    Folosind un separator | între elemente indică faptul că unul dintre elementele separate apare.
    După elemente sau paranteze:
    • ? – apare de 0 sau 1 dată
    • * – 0 sau de mai multe ori
    • + – de 1 sau de mai multe ori

DECLARE ATRIBUTE

Atributele sunt declarate după ce elementul în sine este declarat. Toate atributele unui element sunt declarate simultan, într-o singură listă.

Pentru fiecare atribut sunt înregistrate numele, tipul și statutul obligatoriu.

Tipuri de atribute:
  • CDATA – (Set de caractere de date ) șir de caractere
  • Lista valorilor atributelor în paranteze, enumerate cu „|”
  • ID - identificator unic
  • IDREF – un identificator care conține una dintre valorile atributelor ID , folosit ca referință la alte elemente
  • IDREFS – un identificator care conține un set de valori ale atributelor de tip ID , listat separat de un spațiu, este, de asemenea, folosit ca link către mai multe elemente simultan.
  • ENTITATE – numele entității neverificate de analizor ( declarat in aceeasi descriereDTD )
  • ENTITATI – numele entităților neverificate de analizor.
  • NMTOKEN – un cuvânt care conține doar caractere folosite în nume ( nume ale altor elemente sau atribute, de exemplu pentru a se referi la acestea)
  • NMTOKENS – cuvinte enumerate separate prin spații
  • NOTAŢIE – denumire ( denumiri descifrate în descriereDTD)
  • NOTAȚII – lista de notații
semn de obligație:
  • Valoarea implicită a atributului– este indicat între ghilimele și înseamnă că atributul este opțional.
  • # NECESAR– atributul trebuie să fie scris în element.
  • # IMPLICIT– atributul este optional, nu are valoare implicita.
  • # FIX– atributul are o singură valoare, pisica se scrie imediat separată printr-un spațiu.

Când utilizați spații de nume, trebuie să specificați întotdeauna codul calificat ( QNume), nu un nume local.

Atributele nu sunt incluse în spațiul de nume implicit.

Atribute „ xml:lang " Și " xml:spațiu ” trebuie de asemenea declarată în DTD în cazul utilizării lor

ENTITĂȚI DECLARE

(începe cu „&” și se termină cu „;”)

Entități interne– sunt setate la declararea unei entități.

- poate fi folosit mai departe în foarte DTD Mai jos este reclama.

Entități externe– conținut într-un fișier separat sau încorporat în programul de analiză.

Entități parametrizate– folosit numai în cadrul descrierii DTD

Entitățile sunt împărțite în analizate ( analizat ) și nu analizat ( neanalizat ). Parsed reprezintă un fragment dintr-un document XML sau întregul document și sunt supuse procesării de către programul analizor după înlocuire. După înlocuirea dezasamblarii, entitatea devine parte XML document.

Binar codul programului, desenul, imaginea etc. nu trebuie prelucrate prin mijloace XML , pentru aceasta entitatea trebuie să fie declarată neparsată. Pentru a face acest lucru, la finalul declarației de entitate, se notează „ NDATA ” iar denumirea este indicată ( notaţie ) a obiectului introdus.

ENTITATI PREDEFINITITE IN XML

SIMBOLUL ANUNȚ ( NOTAŢIE)

Ele sunt declarate ca entități și pot fi interne și externe.

Intern

Extern

SISTEM | PUBLIC - în acest caz sunt echivalente deoarece în public nu există neapărat o legătură binecunoscută.

CAZARE DTD

Sau într-un fișier separat „ *.dtd ” prin indicarea numelui său între ghilimele în partea a doua a prologului DOCTYPE , sau includeți descrierea direct în a doua parte a prologului, anexând-o între paranteze drepte.

]> bla

În acest capitol, vom discuta despre atributele DTD. Atributul dă mai multe informatii despre un element, sau mai precis definește o proprietate a elementului. Un atribut XML este întotdeauna sub forma unei perechi im-valoare. Un element poate avea orice număr de atribute unice.

O declarație de atribut este foarte asemănătoare cu declarațiile de elemente în multe feluri, cu excepția unuia; În loc să declarați conținut permis pentru elemente, declarați o listă de atribute permise pentru fiecare element. Aceste liste sunt apelate de declarația ATTLIST.

Sintaxă

Sintaxa de bază pentru declararea atributelor DTD este următoarea:

În sintaxa de mai sus

    Începeți atributele DTD cu

    nume-element specifică numele elementului căruia i se aplică atributul.

    Numele atributului specifică numele atributului care este inclus cu elementul name.

    tip-atribut definește tipul de atribute. Vom discuta mai multe despre acest lucru în secțiunile următoare.

    atribut cu valoare ia o valoare fixă ​​pe care atributele trebuie să o specifice. Vom discuta mai multe despre acest lucru în secțiunile următoare.

Exemplu

Mai jos este un exemplu simplu pentru declararea unui atribut într-un DTD:

]>

Tanmay Patil

Să trecem prin codul de mai sus:

    Începeți cu o declarație XML cu următoarea declarație:

    Imediat după antetul XML este o declarație de tip de document, numită în mod obișnuit DOCTYPE:

    DOCTYPE îi spune parserului că DTD-ul este asociat cu acest document XML. Declarația DOCTYPE are un semn de exclamare (!) la începutul numelui elementului.

    Urmând corpul DTD. Aici am declarat elementul și atributul:

Identificare atribut pentru Nume elementul este definit ca:

Iată tipul de atribut CDATA si sensul ei #NECESAR.

Reguli de declarare a atributelor

    Toate atributele utilizate într-un document XML trebuie să fie declarate într-o definiție a tipului de document (DTD) folosind o declarație Listă de atribute.

    Atributele pot apărea numai în etichetele de început sau goale.

    Cuvântul cheie ATTLIST trebuie să fie în partea de sus - cu majuscule

    Nu vor fi permise nume de atribute duble în lista de atribute pentru un anumit element.

Tipuri de atribute

Prin declararea atributelor, puteți specifica modul în care handlerul ar trebui să ajusteze datele care apar în valoare. Putem clasifica tipul de atribut în trei categorii principale:

    Tip șir

    Tipuri de tokenizate

    Tipuri enumerate

Următorul tabel oferă un rezumat al diferitelor tipuri de atribute:

Tip Descriere
CDATA Date cu caractere CDATA (text și fără creștere de preț). Tip de atribut șir.
Identificare Aceasta este o desemnare unică a atributului. Nu ar trebui să apară de mai multe ori. Tip de atribut Tokenized.
IDREF Este folosit pentru a face referire la identitatea unui alt element. Este folosit pentru a stabili o legătură între elemente. Tip de atribut Tokenized.
IDREFS Este folosit pentru a face referire la ID-uri multiple. Tip de atribut Tokenized.
REALITATE Reprezintă realitatea externă în document. Tip de atribut Tokenized.
REALITATE Reprezintă o listă de realități externe într-un document. Tip de atribut Tokenized.
NMTOKEN Este similar cu CDATA și atributul value constă dintr-un nume XML valid. Tip de atribut Tokenized.
NMTOKENS Este similar cu CDATA și atributul value constă dintr-o listă cu un nume XML valid. Tip de atribut Tokenized.
NOTAŢIE Elementul va fi referit la notația declarată în documentul DTD. Tipul de atribut enumerat.
Desemnare Vă permite să definiți o listă specifică de valori în care una dintre valori trebuie să se potrivească. Tipul de atribut enumerat.

Declararea unui atribut cu o valoare

În cadrul fiecărei declarații de atribut, trebuie să definiți cum va apărea valoarea în document. Puteți defini dacă atributul: atunci

    poate avea valoare implicită

    poate avea o valoare fixă

  • implică

Valori acceptate automat

Conține valoarea implicită. Valorile pot fi cuprinse între ghilimele simple ("") sau ghilimele duble ("")

Sintaxă

Următoarea sintaxă a valorii:

unde sunt valorile implicite sens un atribut specific cu o valoare.

Exemplu

Următorul este un exemplu simplu de declarație de atribut cu o valoare acceptată automat:

]>

Tanmay Patil

În acest exemplu avem un element Nume Cu Carte de identitate atribut a cărui valoare este acceptată automat 0 . Valoarea auto-asumată este cuprinsă între ghilimele duble.

Valori FIXE

Cuvântul cheie #FIXED pentru a urma o valoare fixă ​​este utilizat atunci când doriți să specificați că un atribut cu o valoare este constant și nu poate fi modificat. Utilizarea generală a atributelor fixe definește numerele de versiune.

Sintaxă

Mai jos este sintaxa valorii fixe:

unde #FIXED este un atribut specific cu o valoare.

Exemplu

Următorul este un exemplu simplu de declarație de atribut cu o valoare FIXĂ:

]>

În acest exemplu am folosit cuvântul cheie #FIXED unde indică faptul că valoarea „tutorialspoint” este singura valoare pentru Nume atribut element. Dacă încercăm să schimbăm un atribut cu o valoare după aceasta, dă o eroare.

Urmează DTD nevalid:

]>

suntem o facultate de predare online gratuită

Valori NECESARE

Când doriți să specificați că un atribut este necesar, utilizați cuvântul cheie #NECESAR.

Sintaxă

Urmând sintaxa #NECESARĂ:

unde #NECESAR este un anumit tip de atribut.

Exemplu

Următorul este un exemplu simplu de declarație de atribut DTD cu cuvântul cheie #REQUIRED:

]>

Tanmay Patil

În acest exemplu, am folosit cuvântul cheie #REQUIRED pentru a determina acest lucru Identificare atributul trebuie prevăzut element de nume - Nume

sensuri IMPLICITE

Când declarați atribute, trebuie să specificați întotdeauna o declarație de valoare. Dacă atributul pe care îl declarați nu are o valoare implicită, nu are o valoare fixă ​​și nu este obligatoriu, atunci trebuie să declarați acel atribut ca subînțeles. Cuvântul cheie #IMPLIED este folosit pentru a defini atributul ca subînțeles.

Sintaxă

Urmând sintaxa #IMPLIED:

unde #IMPLIED este un tip de atribut specific.

Exemplu

Urmând un exemplu simplu #IMPLIED

]>

În acest exemplu am folosit cuvântul cheie #IMPLIED deoarece nu dorim să specificăm niciun atribut care să fie inclus în Nume element. Este optional.

Adnotare: Această secțiune descrie principiile generale de scriere Definirea tipului de document. De asemenea, sunt discutate principalele dezavantaje și caracteristici ale DTD.

De ce ai nevoie de un DTD?

Atunci când creează un document XML, dezvoltatorul însuși decide: cum să numească etichetele, în ce ordine vor apărea, ce date vor fi scrise într-un anumit element, dacă elementul va avea sau nu atribute și multe altele. Fără o descriere formală a structurii documentului, doar dezvoltatorul acestuia poate folosi acest document. Dacă documentul XML dezvoltat este destinat transmiterii către lumea exterioară, de exemplu, către partenerii de afaceri, și dacă intenționați să primiți, de asemenea, documente scrise în același format ca răspuns, nu puteți face fără definirea tipului de document (DTD). Acest lucru se datorează faptului că, pentru ca ambele părți să înțeleagă informațiile primite, elementele și atributele din documente trebuie să fie folosite de toate părțile în același mod. Definițiile tipului de document aduc rigoare și precizie regulilor de scriere a documentelor XML bine formate. Stocate la începutul unui fișier XML sau extern ca fișier *.DTD, definițiile tipului de document descriu structura de informații a unui document. DTD-ul listează nume posibile de elemente, definește atributele disponibile pentru fiecare tip de element și descrie imbricarea elementelor.

XML este folosit ca mijloc de a descrie gramatica altor limbi. Și astfel, dezvoltând un limbaj pentru scrierea documentelor XML într-o anumită zonă, va trebui să dezvoltăm un dicționar pentru această zonă de activitate. DTD-urile conțin prin definiție toate informațiile care pot apărea într-un document XML. Tot ceea ce intră în proiect trebuie inclus în DTD. Astfel, descrierea DTD este în esență un astfel de dicționar. Lumea modernă se schimbă destul de dinamic, așa că nu se știe dinainte ce informații ar putea fi necesare în viitor și, pentru a evita schimbarea frecventă a structurii documentelor, un dicționar dezvoltat de obicei include tot ceea ce poate fi necesar pentru anumite tipuri de afaceri sau industrie. Acest lucru permite definițiilor DTD să fie utilizate ca instrument de analiză și proiectare. Aplicațiile XML comunică între ele pe baza vocabularelor pe care le înțeleg, așa că definirea unui DTD ajută la înțelegerea a ceea ce poate descrie aplicația.

O altă utilizare a DTD este verificarea corectitudinii unui document XML scris. Documentele bine formate, scrise conform tuturor regulilor descrise în specificația XML, nu pot fi verificate pentru erori. Erorile ratate pot cauza deteriorarea programului care procesează aceste documente sau introducerea de date incorecte în sistem. Dar dacă documentul face referire la o definiție DTD, atunci folosind un parser de validare putem verifica dacă există erori în documentul nostru. Analizatorul va solicita DTD și se va asigura că documentul respectă regulile gramaticale descrise în el. Analizorul detectează erorile structurale și de conținut, ceea ce reduce foarte mult cantitatea de verificări efectuate de logica aplicației.

Scrierea definițiilor DTD: principii generale.

Asocierea unui DTD cu un document XML

XML 1.0 oferă o declarație DOCTYPE specială pentru a asocia o declarație DTD cu o instanță de document. Trebuie să urmeze declarația XML și să precedă orice elemente ale documentului. Cu toate acestea, pot exista comentarii și comenzi de procesare între declarațiile XML și DOCTYPE.

O declarație DOCTYPE conține cuvântul cheie DOCTYPE, urmat de numele elementului rădăcină al documentului și apoi un construct de declarație de conținut. Înainte de a explica această declarație, să ne uităm la un exemplu de locație a unei declarații DOCTYPE într-o instanță de document. Mai jos sunt primele trei rânduri ale documentului XML:

..

Puteți scrie subsetul exterior de declarații într-un fișier DTD separat, puteți include subsetul interior în corpul declarației DOCTYPE sau ambele. În acest din urmă caz ​​(amestecarea DTD-urilor interne și externe), pot fi specificate declarații noi în DTD-urile interne sau cele conținute în cele externe pot fi rescrise (prin definiția specificației XML, analizatorii citesc mai întâi subsetul intern și, prin urmare, declarațiile). conținute acolo au prioritate).

Declarațiile XML pot conține un atribut autonom, care acceptă doar valorile „da” și „nu”. Dacă valoarea atributului este da, atunci declarațiile externe instanței documentului nu afectează informațiile transmise de document către aplicația care îl utilizează. Valoarea nu indică faptul că există declarații externe cu valori necesare pentru a descrie corect conținutul documentului - de exemplu, anumite valori implicite. În practică, atributul opțional de sine stătător este rar folosit. Având acest atribut setat la yes nu garantează absența dependențelor externe de orice tip. Doar că dependențele externe în acest caz nu vor duce la o eroare în document dacă nu sunt incluse în procesare. Deci, practic, acest atribut este un semn pentru analizatori și alte aplicații care indică dacă trebuie să utilizeze orice conținut extern.

Blocul de declarații interne al marcajului etichetei DOCTYPE constă dintr-o paranteză pătrată din stânga, o listă de declarații și o paranteză dreptă:

DTD-urile interne sunt foarte utile, sunt întotdeauna conținute în documentul care le folosește și, prin urmare, pot fi recuperate cu ușurință de parser. Cu toate acestea, DTD-urile interne cresc semnificativ dimensiunea documentului. În practică, DTD-urile interne sunt cel mai adesea folosite simultan cu cele externe pentru a adăuga declarații noi. Dacă acolo este declarat orice obiect care este declarat și în DTD-ul exterior, cel interior are prioritate. Acest lucru vă permite să ajustați declarațiile pentru a se potrivi nevoilor documentelor specifice.

DTD-urile externe sunt mai flexibile în unele privințe. În acest caz, declarația DOCTYPE constă din cuvântul cheie obișnuit și numele elementului rădăcină, urmate de un alt cuvânt cheie, SYSTEM sau PUBLIC, indicând sursa definiției DTD externe, urmată de localizarea acelei definiții. Dacă cuvântul cheie este SYSTEM , DTD-ul trebuie să se afle direct și explicit la adresa URL specificată.

Dacă DTD-urile externe sunt rescrise foarte des, ele încep să-și piardă sensul, ceea ce este un semn al unui design inițial prost.

Cuvântul cheie PUBLIC este destinat dicționarelor cunoscute. O aplicație care analizează un document din acest dicționar trebuie să folosească o strategie pentru a găsi DTD-ul adecvat.

Standardul XML 1.0 permite unei declarații PUBLIC să aibă atât un URI public, cât și un identificator de sistem. Dacă o aplicație sau un parser care rulează un document nu poate găsi un DTD dintr-un URI cu cuvântul cheie PUBLIC, trebuie să utilizeze identificatorul de sistem.

Declarații de bază de markup

Conținutul permis într-un document XML este determinat de patru tipuri de declarații de markup în DTD. Următorul tabel prezintă cuvintele cheie asociate acestor declarații și semnificațiile acestora:

Primele două tipuri sunt legate de informațiile pe care ne așteptăm să le găsim într-un document XML - elemente și atribute.

Ultimele două tipuri sunt folosite pentru sprijin. Entitățile XML fac viața deosebit de ușoară pentru dezvoltatorul unui dicționar. De obicei, acestea constau din conținut care este atât de frecvent utilizat în DTD sau document, încât justifică crearea unei declarații speciale. Utilizarea acestei declarații amintește de declarația include în limbajele C/C++, unde un nume este folosit ca înlocuitor pentru conținut.

Notațiile descriu conținut care nu este scris în XML. Sunt folosite pentru a declara o anumită clasă de date și pentru a o asocia cu un program extern. Acest program extern devine un handler pentru clasa de date declarată. De exemplu, după ce a asociat o imagine JPEG cu un document, dezvoltatorul dorește ca programul să accepte și să redea date binare în acel format. Desigur, în acest caz, documentul depinde de ce tip de handler este disponibil pe sistemul care primește documentul. În interesul portabilității, unii autori nu oferă link-uri către handler. În acest caz, notația devine pur și simplu un mecanism de tastare.

Un DTD este un set de reguli de sintaxă în raport cu care este verificată structura unui document XML. Un DTD definește în mod explicit structura unui document XML, specifică elementele și atributele acestora și oferă alte informații care se aplică tuturor documentelor XML generate din DTD.

Vă rugăm să rețineți că prezența unui DTD nu este obligatorie. Dacă există un DTD, sistemul XML îl utilizează pentru a interpreta documentul XML. Dacă nu există DTD, este de așteptat ca sistemul XML să interpreteze documentul conform propriilor reguli. Cu toate acestea, este totuși recomandat să creați un DTD pentru documentele XML, deoarece acest lucru le face mai ușor de interpretat și verificat structura.

DTD-ul poate fi inclus direct în documentul XML, referit prin URL sau o combinație a celor două. Când includeți un DTD direct într-un document XML, definiția DTD apare imediat după prolog:

Atributul root_element_name se potrivește cu numele elementului rădăcină din etichetele care conțin întregul document XML. Secțiunea „alte declarații” conține definiții ale elementelor, atributelor etc.

Poate preferați să plasați DTD-ul într-un fișier separat pentru a menține o structură de program modulară. Să vedem cum arată un link către un DTD extern într-un document XML. Problema poate fi rezolvată cu o singură comandă simplă:

Ca și în cazul declarației interne DTD, root_element_name trebuie să se potrivească cu numele elementului rădăcină din etichetele care conțin întregul document XML. Atributul SYSTEM indică faptul că some_dtd.dtd se află pe serverul local. Cu toate acestea, fișierul some_dtd.dtd poate fi referit și prin URL-ul său absolut. În cele din urmă, adresa URL a DTD-ului extern, situat pe un server local sau la distanță, este specificată între ghilimele.

Deci, cum creezi un DTD pentru Listarea 14.1? În primul rând, vom crea o referință la DTD extern în documentul XML. După cum sa menționat în secțiunea anterioară, o referință DTD arată astfel:

Revenind la Lista 14.1, vedem că cookbook este numele elementului rădăcină, iar cookbook.dtd este numele fișierului DTD. Conținutul DTD-ului este prezentat în Lista 14.2, iar mai jos sunt oferite descrieri detaliate ale fiecărui rând.

Lista 14.2. DTD pentru listarea 14.1(cookbook.dtd)

] >

Ce înseamnă acest document misterios? În ciuda complexității sale aparente, este de fapt destul de simplu. Să parcurgem întregul conținut al Listingului 14.2:

În fața noastră este prologul XML, care a fost deja menționat mai sus.

A treia linie descrie elementul XML, în acest caz elementul rădăcină al cărții de bucate. Este urmat de cuvântul rețetă, cuprins între paranteze. Aceasta înseamnă că etichetele cărților de bucate conțin o subetichetă numită rețetă. Semnul + indică faptul că etichetele cărții de bucate părinte conțin una sau mai multe perechi de etichete de rețetă.

Al patrulea rând descrie eticheta rețetei. Se menționează că eticheta de rețetă are patru subetichete: titlu, descriere, ingrediente și proces. Deoarece numele etichetelor nu sunt urmate de indicatori de repetare (vezi secțiunea următoare), etichetele de rețetă trebuie să conțină exact o pereche din fiecare dintre etichetele enumerate.

Iată prima definiție a unei etichete care nu conține etichete imbricate. Prin definiție, conține #PCDATA, care sunt date de caracter arbitrare care nu sunt considerate parte a markupului.

Prin definiție, elementul ingrediente conține una sau mai multe etichete numite ingredient. Consultați Lista 14.1 și veți înțelege.

Deoarece elementul ingredient corespunde unui singur ingredient, are sens ca elementul să conțină date simple de caractere.

Elementul de proces conține una sau mai multe instanțe ale elementului pas.

Elementul pas, ca și elementul ingredient, corespunde unui articol individual dintr-o listă de nivel superior. Prin urmare, trebuie să conțină date de caractere.

Observați că elementul rețetă din Lista 14.1 conține un atribut. Acest atribut, categorie, precizează categoria generală căreia îi aparține rețeta - în exemplul dat, categoria „italiană” (italiană). Definiția ATTLIST specifică atât numele elementului, cât și numele atributului. În plus, atribuirea fiecărei rețete unei anumite categorii simplifică clasificarea, astfel încât atributul este declarat obligatoriu (#NECESAR).

Ultima linie completează pur și simplu definiția DTD. Definiția trebuie întotdeauna completată corespunzător, altfel va apărea o eroare.

Pentru a încheia această secțiune, voi oferi un rezumat al componentelor principale ale unui fișier DTD tipic:

  • declarații de tip de element;
  • declarații de atribute;
  • ID, IDREF și IDREFS;
  • declarații de entitate.

Am văzut deja unele dintre aceste componente în Lista 14.2. Fiecare componentă va fi descrisă mai detaliat mai jos.

Declarații de elemente

Toate elementele utilizate într-un document XML trebuie definite în DTD-ul care însoțește documentul. Am văzut deja două tipuri comune de definiții: pentru un element care conține alte elemente și pentru un element care conține date de caractere. Această definiție indică faptul că elementul conține doar date de caractere:

Următoarea definiție a elementului de proces spune că acesta conține exact un element imbricat numit pas:

Cu toate acestea, procesele cu un singur pas sunt destul de rare - cel mai probabil, vor fi mai mulți pași. Pentru a indica faptul că un element conține una sau mai multe instanțe ale unui element de pas imbricat, utilizați indicatorul de repetiție:

Numărul de elemente imbricate poate fi setat în mai multe moduri. O listă completă a operatorilor de elemente este dată în tabel. 14.1.

Tabelul 14.1. Operatori de elemente

Dacă un element va conține mai multe subelemente, acestea ar trebui listate separate prin virgule în definiția elementului părinte:

Deoarece caracteristicile de repetiție nu sunt specificate, fiecare etichetă trebuie să apară exact o dată.

Definiția unui element este rafinată folosind operatori logici. Să presupunem că lucrați cu rețete care includ întotdeauna paste cu unul sau mai multe tipuri de brânză sau carne. În acest caz, elementul ingredient este definit după cum urmează:

Deoarece elementul paste trebuie să fie prezent în elementul ingredient, acesta este indicat cu semnul de repetiție +. Acesta este urmat fie de un element de brânză, fie de un element de carne; Separăm alternativele cu o bară verticală și le închidem în paranteze cu semnul +, deoarece rețeta include întotdeauna una sau alta.

Există și alte tipuri de definiții ale elementelor. Am luat în considerare doar cazurile cele mai simple. Cu toate acestea, materialul oferit este suficient pentru a înțelege exemplele date în restul acestui capitol.

Declarații de atribute

Atributele elementului descriu valorile asociate elementelor. Elementele XML, cum ar fi elementele HTML, pot avea zero, unul sau mai multe atribute. Sintaxa generală pentru declararea atributelor este următoarea:

ElementName specifică numele elementului de inclus în etichetă. Atributele asociate cu elementul sunt apoi listate. Fiecare declarație de atribut constă din trei componente principale: un nume, un tip de date și un indicator care definește caracteristicile acelui atribut. Declarațiile altor atribute pot fi plasate în locul punctelor de suspensie (...).

Am văzut deja o declarație simplă de atribut în Lista 14.2:

Cu toate acestea, după cum se poate vedea din definiția generală dată, este posibil să se declare mai multe atribute în același timp. Să presupunem că, pe lângă atributul categorie, doriți să asociați un atribut de dificultate suplimentar cu elementul rețetă. Ambele atribute sunt declarate în aceeași listă:

Nu este necesar să formatați anunțurile în acest fel; cu toate acestea, declarațiile pe mai multe rânduri sunt mai clare decât declarațiile pe o singură linie. În plus, deoarece ambele atribute sunt necesare, eticheta reci re nu poate fi limitată la un singur atribut, trebuie să includă ambele atribute simultan. De exemplu, următoarea etichetă ar fi considerată nevalidă:

De ce? Pentru că îi lipsește atributul categorie. O etichetă validă trebuie să conțină ambele atribute:

Condițiile speciale pentru procesarea atributelor sunt descrise de trei indicatoare enumerate în tabel. 14.2.

Tabelul 14.2. Steaguri de atribut

Tipuri de atribute

Un atribut de element poate fi declarat cu un anumit tip. Tipurile de atribute sunt descrise mai jos.

Atributele CDATA

Foarte des atributele conțin date generale de caractere. Aceste atribute sunt numite atribute CDATA. Următorul exemplu a fost deja întâlnit la începutul acestei secțiuni:

Atribute ID, IDREF și IDREFS

Ideea reprezentării fără ambiguitate a datelor (de exemplu, informații despre un utilizator sau despre un produs stocat într-o bază de date) prin identificatori a fost întâlnită de mai multe ori în capitolele anterioare ale cărții. Identificatorii sunt, de asemenea, adesea folosiți în XML, deoarece referințele încrucișate între documente sunt utilizate nu numai în sarcinile generale de prelucrare a datelor, ci și în World Wide Web (hyperlink-uri).

Identificatorii de elemente sunt atribuiți atributului ID. Să presupunem că doriți să asociați un ID unic cu fiecare rețetă. Fragmentul DTD corespunzător ar putea arăta astfel:

Declarația elementului de rețetă din document ar putea arăta astfel:

Spaghete alla Carbonara

Rețeta este identificată în mod unic prin identificatorul ital003. Rețineți că atributul redpe-id este de tip ID, deci ital003 nu poate fi folosit ca valoare a atributului recipe-id al altui element, altfel documentul va fi considerat invalid din punct de vedere sintactic. Acum să presupunem că mai târziu doriți să faceți referire la această rețetă dintr-un alt document - să zicem, din lista de rețete preferate a unui utilizator. Aici intră în joc referințele încrucișate și atributul IDREF. Atributului IDREF i se atribuie un identificator care este utilizat pentru a face referire la element, similar modului în care o adresă URL este utilizată pentru a identifica o pagină într-un hyperlink. Luați în considerare următorul fragment de cod XML:

Când documentul XML este procesat, elementul este înlocuit cu un link mai descriptiv către rețetă cu identificatorul specificat (de exemplu, numele rețetei). Probabil va fi formatat ca hyperlink pentru a facilita navigarea la rețeta specificată.

Atribute enumerabile

Când declarați un atribut, puteți enumera toate valorile valide acceptate de atribut. În exemplul nostru, acest lucru ar fi convenabil deoarece puteți determina imediat lista de categorii valide. Declarația de mai sus este scrisă după cum urmează:

Rețineți că atunci când utilizați liste de valori valide, nu este necesar să includeți tipul CDATA în declarație, deoarece toate valorile enumerate sunt în format CDATA.

Atribute enumerate cu valoare implicită

Uneori este convenabil să declarați o valoare implicită pentru un atribut. Sunt șanse să fi făcut asta înainte când construiești formulare cu liste derulante. De exemplu, dacă majoritatea rețetelor din cartea de bucate sunt italiene, atributul rețetă va fi adesea clasificat ca italian. În acest caz, categoria italiană poate fi atribuită ca implicită:

Dacă atributul categoriei nu este specificat în mod explicit, acesta este implicit italian.

Atributele ENTITY și ENTITIES

Datele din documentele XML nu sunt întotdeauna text - documentul poate conține și informații binare (de exemplu, grafice). Astfel de date pot fi referite folosind atributul entitate. De exemplu, în descrierea elementului de descriere puteți specifica atributul recipePicture cu o imagine grafică:

De asemenea, puteți declara mai multe entități simultan prin înlocuirea ENTITY cu ENTITIES. Valorile sunt separate prin spații.

Atributele NMTOKEN și NMTOKENS

Atributele NMTOKEN sunt șiruri de caractere incluse într-un set limitat. Declararea unui atribut de tip NMTOKEN presupune că valoarea atributului respectă constrângerile specificate. De obicei, valoarea atributului NMTOKEN constă dintr-un cuvânt:

Puteți declara mai multe atribute simultan prin înlocuirea NMTOKEN cu NMTOKENS. Valorile sunt separate prin spații.

Declarații de entitate

O declarație de entitate este similară cu comanda define în unele limbaje de programare, inclusiv PHP. Referințele la entități au fost menționate pe scurt în secțiunea anterioară, „Prezentarea sintaxei XML”. Pentru orice eventualitate, permiteți-mi să vă reamintesc că un link de entitate este folosit ca înlocuitor pentru un alt conținut. Când un document XML este procesat, toate aparițiile unei entități sunt înlocuite cu conținutul pe care îl reprezintă. Există două tipuri de entități: interne și externe.

Entități interne

Entitățile interne sunt ca și variabile șir care asociază un nume cu o bucată de text. De exemplu, dacă doriți să definiți un nume pentru un link către informații despre drepturile de autor, puteți declara o entitate ca aceasta:

În timpul procesării documentelor, toate cazurile de &Copyright sunt înlocuite cu textul „Copyright 2000 YourCompanyName. Toate drepturile rezervate." Tot codul XML din textul de înlocuire este tratat ca și cum ar fi prezent în documentul original.

Entitățile interne sunt utile în situațiile în care intenționați să utilizați entitatea într-un număr relativ mic de documente XML. Dacă aveți un număr mare de documente, este mai bine să utilizați entități externe.

Entități externe

Entitățile externe sunt folosite pentru a face referire la conținutul aflat într-un alt fișier. Entitățile de acest tip pot conține informații textuale, dar se pot referi și la date binare (de exemplu, grafice). Revenind la exemplul anterior, să presupunem că decideți să salvați informațiile despre drepturile de autor într-un fișier separat pentru a facilita editarea în viitor. Linkul către fișierul creat arată astfel:

Când documentul XML este ulterior procesat, toate referințele &Copyright sunt înlocuite cu conținutul documentului copyright.xml. Tot codul XML din textul de înlocuire este tratat ca și cum ar fi prezent în documentul original.

Entitățile externe sunt utile și pentru referirea imaginilor grafice. De exemplu, dacă doriți să includeți o siglă grafică într-un document XML, creați o entitate externă:

Resurse XML

Deși materialul de mai sus este suficient pentru a înțelege structura de bază a documentelor XML, acesta nu este complet. Mai jos sunt link-uri către resurse de internet care conțin informații mai detaliate:

Restul capitolului vă arată cum să utilizați PHP pentru a procesa documente XML. La prima vedere, sarcina pare foarte dificilă (analiza lexicală a oricăror documente de orice tip provoacă o mulțime de dificultăți).

Dar odată ce te familiarizezi cu strategia de bază pentru lucrul cu XML în PHP, totul se dovedește a fi surprinzător de simplu.

Exact asta sunt. Mai mult decât atât, XML în sine oferă extensibilitate. Documentele create folosind aceste limbi pot fi „bine formate” și „valide”.

Nu există probleme la verificarea corectitudinii documentului: dacă nu apar erori și totul este afișat așa cum ne-am dorit, atunci documentul este corect. De exemplu, dacă scrieți ceva de genul „ Buna ziua!", atunci documentul nostru va fi complet corect, dar ignorat de browser. De ce? Pentru că browserul nu știe nimic despre ce fel de „Z” este acesta. Și dacă ne verificăm validitatea documentului folosind un validator, atunci documentul nu va fi recunoscut ca atare. De unde știe validatorul despre acest lucru și pe ce bază a făcut un astfel de verdict?

Valabilitatea este verificată folosind o definiție a tipului de document (DTD). De exemplu, pentru HTML „strict” arată astfel.

DTD poate fi descris atât în ​​interiorul documentului, cât și în dosar separat(similar cu CSS: foi de stil integrate și plug-in).

Declarație DTD

Declarația DTD este plasată înaintea primului element (rădăcină) al documentului, începând cu secvența " ».

DTD-ul intern este descris astfel:

Între paranteze pătrate se află conținutul DTD, așa-numitul subset intern, De exemplu:

] >

Dacă DTD-ul este plasat într-un fișier separat (de obicei cu extensia .dtd), atunci declarația sa în document este scrisă astfel:

În consecință, toate regulile sunt scrise în acest fișier, așa-numitul subset extern.

Numele care urmează cuvântului „DOCTYPE” (în cazul nostru „catalog”) trebuie să se potrivească cu numele elementului rădăcină. Adică, documentul XML ar trebui să fie cam așa:

Salut Lume!

În loc de cuvântul cheie „SISTEM”, cuvântul „PUBLIC” poate fi folosit pentru a indica faptul că DTD-ul este destinat utilizării generale:

Subseturile interioare și exterioare pot fi specificate simultan (din nou, similar cu CSS):

] >

Aici se citește mai întâi conținutul fișierului „catalog.dtd”, apoi conținutul specificat între paranteze pătrate.

Elementele documentului

Elementele sunt declarate în DTD folosind cuvântul cheie „ELEMENT”, urmat de numele elementului și conținutul acestuia, cuprins între paranteze:

Dacă un element are elemente copil, se scrie astfel:

care corespunde documentului:

</book> </p><p>Dacă un element are mai multe <a href="https://radiobud.ru/ro/life-hacks-for-windows/tehniki-raboty-s-dom-roditelskie-dochernie-i-sosednie-elementy.html">elemente copil</a>, apoi sunt listate separate prin virgule și trebuie să urmeze strict în ordinea specificată:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> </p><p>Exemplul de mai sus arată după cum urmează. Elementul „carte” trebuie să conțină un singur element „titlu”, urmat de un singur element „autor”. Elementele „titlu” și „autor” în sine nu conțin niciun element, ci pot conține doar ceva text.</p> <p>Următoarele caractere speciale pot fi folosite pentru a cuantifica prezența unui element:</p> <ul><li>Caracterul „*” care urmează unui element înseamnă că elementul poate fi prezent o dată sau de mai multe ori sau să nu fie prezent deloc (de la zero la + infinit)</li> <li>Simbolul „+” care urmează unui element înseamnă că elementul poate apărea o dată sau de mai multe ori (de la 1 la + infinit)</li> <li>Simbolul „? ", după element, înseamnă că elementul poate fi fie absent, fie prezent o singură dată (0 sau 1)</li> </ul> <!ELEMENT book (title, author)> ... <!ELEMENT book (title*, author)> ... <!ELEMENT book (title+, author)> ... <!ELEMENT book (title?, author)> <p>Dacă este necesar să indicați unul dintre mai multe elemente (fie titlu, fie autor - oricare dintre ele, dar nu ambele), trebuie să utilizați simbolul " | ":</p><p> <!ELEMENT book (title | author)> </p><p>Textul este, de asemenea, un participant egal la joc. Cuvântul cheie „PCDATA” indică datele despre caractere care trebuie analizate, deci orice text care conține caractere de marcare ("< », « >" și " & ") vor fi tratate ca markup. <a href="https://radiobud.ru/ro/life-hacks-wi-fi/frilansery-dlya-sozdaniya-programm-na-android-mobilnye-prilozheniya-dlya.html">Partajarea</a> text și elemente se numește <i>continut mixt</i>. Când se declară conținut mixt, trebuie specificat mai întâi „PCDATA”:</p><p> <!ELEMENT book (#PCDATA | title | author)> </p><p>Următorul fragment de document este valabil pentru exemplul de mai sus:</p><p> <book> <title /> </book> <book> <author /> </book> <book>Nu există date</book> </p><p>Grupurile de elemente sunt cuprinse între paranteze. Elementul „carte” trebuie să conțină fie text, fie (un „titlu”, unul sau mai mulți „autor” și poate un „pubyear” în această ordine):</p><p> <!ELEMENT book (#PCDATA | (title, author+, pubyear?))> <!ELEMENT disc (#PCDATA | title)*> </p><p>Următorul fragment de document XML corespunde acestui exemplu:</p><p> <disc /> <book> <title /> <author /> <author /> </book> <book>Nu există date</book> </p><p>Elementul poate fi gol. Un astfel de element nu poate conține niciun element copil sau text (de exemplu, elementul „br” în HTML). Un astfel de element este specificat cu cuvântul cheie „GOL”:</p><p> <!ELEMENT photo EMPTY> </p><p>Un element poate fi declarat și cu cuvântul cheie „ORICE”, ceea ce înseamnă că elementul poate conține atât elemente, cât și text, toate și chiar să fie gol.</p> <h3>Atributele elementului</h3> <p>Elementele dintr-un document XML pot avea atribute, care sunt scrise ca „nume=valoare” în etichetele de deschidere sau goale. O declarație generală a atributelor unui anumit element începe cu cuvântul cheie „ATTLIST”, urmat de numele elementului și declararea atributelor în sine:</p><p> <!ELEMENT title (#PCDATA)> <!ATTLIST title id CDATA #REQUIRED stock CDATA #IMPLIED> </p><p>Cuvântul cheie „NECESAR” indică faptul că atributul este obligatoriu. Cuvântul cheie „IMPLICAT”, pe de altă parte, spune că atributul este opțional.</p> <p>Atributele pot avea o listă de valori permise:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED> </p><p>Valoarea implicită poate fi, de asemenea, setată:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED "yes">pubyear CDATA #IMPLIED "2007"></p><p>Un atribut poate fi și o constantă, adică poate avea doar valoarea care este declarată în declarația de atribut. Acest lucru se face folosind cuvântul cheie „FIXED”:</p><p> <!ATTLIST title copyright <strong>#FIXED „udvikler”></p><p>Tipul de atribut „CDATA” permite utilizarea oricăror caractere, cu excepția „< », « >", " & ", " " " Și " " ". Dacă sunt utilizate, aceste caractere trebuie înlocuite cu caractere speciale precum „< » и т.п. Внимание : в DTD ключевое слово « CDATA » имеет другое значение, чем раздел « CDATA » в XML-документе!</p> <p>Pe lângă tipul CDATA, atributele pot avea următoarele tipuri:</p> <ul><li>NMTOKEN - poate conține doar litere, cifre, ". ", " - ", " _ " Și " : "</li> <li>NMTOKENS - poate conține aceleași caractere ca „NMTOKEN” plus spațiu, întoarcere la cărucior, avans de linie și caractere de tabulație</li> </ul> <!ATTLIST title id CDATA #REQUIRED stock NMTOKEN #IMPLIED publisher NMTOKENS #IMPLIED> <p>Un alt tip de atribut, „ID”, permite aceleași valori ca și tipul NMTOKEN, dar valoarea trebuie să înceapă fie cu o literă, „_”, fie cu „:”. Orice element poate avea un singur atribut de tip „ID”. Un atribut de tip „ID” nu poate fi o constantă (declarată ca „FIXED”). Valoarea unui atribut de tip „ID” trebuie să fie unică în întregul document XML:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ATTLIST title id ID #REQUIRED stock CDATA #IMPLIED> <!ATTLIST author id ID #REQUIRED city CDATA #IMPLIED> </p><p>Un atribut de element poate fi o referință la un atribut de tip „ID” al altui element. Pentru a face acest lucru, este declarat ca un atribut de tip „IDREF”. Dacă un atribut trebuie să se refere la un atribut de tip „ID” al mai multor elemente, atunci se utilizează cuvântul cheie „IDREFS”:</p><p> <!ELEMENT book (title+, author, year, publisher)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ATTLIST title id ID #REQUIRED> <!ATTLIST author id ID #REQUIRED> <!ATTLIST year ref IDREF #REQUIRED> <!ATTLIST publisher from IDREFS #REQUIRED> </p><p>În documentul XML va arăta astfel:</p><p> <book> <title id="t1" /> <title id="t2" /> <title id="t3" /> <author id="a1" /> <year ref="t2" /> <publisher from="t1 t2 a1" /> </book> </p><h3>Entități declarante</h3> <p>Pe lângă elemente și atributele acestora, putem defini <i>esență</i>, scris folosind cuvântul cheie „ENTITY”:</p><p> <!ENTITY name "SuperMegaMaster"> </p><p> <userName>&name;</userName> </p><p>Ca urmare, numele entității „nume” va fi înlocuit cu valoarea sa, în cazul nostru „SuperMegaMaster”.</p> <p>Și pentru a ne completa fericirea, trebuie să adăugăm că atributele elementelor pot avea entități similare ca semnificații - <i>atribute-entitate</i>. Ele sunt, de asemenea, definite folosind cuvântul cheie „ENTITY”, dar au o limitare - trebuie să se refere la entități externe neanalizate definite în subsetul extern al DTD:</p><p> <!DOCTYPE catalog [ <!ENTITY list SYSTEM "companyList.html" NDATA parse> <!ELEMENT catalog (user+)> <!ELEMENT user (name)> <!ATTLIST user company ENTITY #REQUIRED> <!ELEMENT name (#PCDATA)> ] > </p><p>În exemplul de mai sus, este declarată o entitate „listă” care face referire la un document extern „companyList.html”. Cuvântul cheie „NDATA” indică faptul că documentul extern nu este un document XML. În continuare, pentru elementul „utilizator” se declară atributul „firma”, care este obligatoriu și are tipul „ENTITATE”, adică se referă la o entitate. Deoarece în exemplul nostru este specificată o singură entitate („listă”), aceasta și numai aceasta poate fi valoarea atributului „companie” din documentul XML:</p><p> <catalog> <user company="list"> <name>SuperMegaMaster</name> </user> </catalog> </p><p>Tot ce rămâne este să înțelegem ce înseamnă „parse” în linia de declarație a entității „listă”? Când folosiți date neparsate, adică date care nu sunt analizate de parserul XML, este bine să furnizați informații aplicației (folosind <a href="https://radiobud.ru/ro/internet/poluchit-dannye-iz-xml-1s-formirovanie-faila-xml-prostaya-vygruzka.html">acest document XML</a>), cum se procesează această entitate, dacă este necesar. Pentru a face acest lucru, trebuie să folosim notația specificată de cuvântul cheie „NOTARE” și să adăugăm DTD-ul nostru după cum urmează:</p><p> <!NOTATION parse SYSTEM "iexlorer"> <!ENTITY list SYSTEM "companyList.html" NDATA parse> </p><p>Cuvântul „parse” din declarația entității foaie indică modul în care puteți analiza fișierul „companyList.html” - găsiți o notație numită „parse” și urmați instrucțiunile acesteia. În cazul nostru, aplicația poate deschide MS InternetExplorer și poate încărca în el documentul „companyList.html”.</p> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> <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> </article> <div class='yarpp-related'> <div class="related-items"> <div class="headline">Vă recomandăm alte articole</div> <div class="items"> <div class="item"> <a href="https://radiobud.ru/ro/reviews/kak-prazdnovat-letnee-solncestoyanie-kak-prazdnovat-letnee-solncestoyanie.html" class="item__link"> <img src="/uploads/d002eb7ee7f8ca5839027a5ec58464a2.jpg" width="220" height="170" alt="Cum să sărbătorim solstițiul de vară Emmanuelle Daguerre: un solstițiu de vindecare" class="item__image" / loading=lazy loading=lazy> <div class="item__title">Cum să sărbătorim solstițiul de vară Emmanuelle Daguerre: un solstițiu de vindecare</div> </a> </div> <div class="item"> <a href="https://radiobud.ru/ro/internet/programmirovanie-mikrokontrollerov-dlya-nachinayushchih-legko-i.html" class="item__link"> <img src="/uploads/cc080e5fe541f0a30c5c0fdf1654e93a.jpg" width="220" height="170" alt="Programare microcontrolere AVR pentru începători Programare controlere AVR pentru începători" class="item__image" / loading=lazy loading=lazy> <div class="item__title">Programare microcontrolere AVR pentru începători Programare controlere AVR pentru începători</div> </a> </div> <div class="item"> <a href="https://radiobud.ru/ro/life-hacks-for-ios/pochemu-planshet-ne-vyklyuchaetsya-chto-delat-zavis-planshet---chto-delat-vozmozhnye.html" class="item__link"> <img src="/uploads/5ee684d277379108d1f4344cff82eff8.jpg" width="220" height="170" alt="Tableta congelată - ce să faci?" class="item__image" / loading=lazy loading=lazy> <div class="item__title">Tableta congelată - ce să faci?</div> </a> </div> </div> </div> </div> </main> <aside class="sidebar"> <div class="section"> <div class="section__headline">Cel mai popular</div> <div class="sidebar-items"> <a class="sidebar-item" href="https://radiobud.ru/ro/program/videonablyudenie-cherez-usb-kameru-besprovodnaya-usb-kamera-kupit.html"> <img src="/uploads/c5ad1ebb2eec805aceb765a476962621.jpg" width="75" height="75" alt="Cameră wireless USB cumpărați o mini cameră wireless pentru computer Cameră digitală cu ieșire USB" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Cameră wireless USB cumpărați o mini cameră wireless pentru computer Cameră digitală cu ieșire USB</div> </a> <a class="sidebar-item" href="https://radiobud.ru/ro/life-hacks-for-pc/sem-putei-voiti-v-svoi-lichnyi-kabinet-stoloto-russkoe-loto-obman.html"> <img src="/uploads/ef0eb579f517d663a977671e7a51ce14.jpg" width="75" height="75" alt="Stoloto, loto rusesc – o înșelătorie?" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Stoloto, loto rusesc – o înșelătorie?</div> </a> <a class="sidebar-item" href="https://radiobud.ru/ro/internet/v-chem-smysl-maininga-kak-rabotaet-maining-kriptovalyuty-process.html"> <img src="/uploads/e7ccb6fbe0cf024cedb045c511cf5fad.jpg" width="75" height="75" alt="Cum funcționează mineritul criptomonedei Procesul de extragere a criptomonedei" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Cum funcționează mineritul criptomonedei Procesul de extragere a criptomonedei</div> </a> <a class="sidebar-item" href="https://radiobud.ru/ro/game/professiya-programmist-dlya-detei-konspekt-zanyatiya-v-detskom.html"> <img src="/uploads/9d0201b81adc610408d4507ccf6f9186.jpg" width="75" height="75" alt="Rezumatul unei lecții la grădiniță „Programatorul este un vrăjitor grozav”" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Rezumatul unei lecții la grădiniță „Programatorul este un vrăjitor grozav”</div> </a> <a class="sidebar-item" href="https://radiobud.ru/ro/life-hacks-for-ios/aliekspress-prosit-ukazat-proverochnyi-kod-pri-vhode-chto.html"> <img src="/uploads/85f99bb622febba2f51f6ce46c571a8f.jpg" width="75" height="75" alt="Cum să treci verificarea când te conectezi la contul tău pe Aliexpress?" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Cum să treci verificarea când te conectezi la contul tău pe Aliexpress?</div> </a> <a class="sidebar-item" href="https://radiobud.ru/ro/game/otklyuchenie-uslugi-mobilnye-podpiski-kak-uznat-kakie-platnye.html"> <img src="/uploads/ce520cb58283add55341e217e52bd195.jpg" width="75" height="75" alt="Cum să aflați ce abonamente plătite de la Megafon sunt conectate și cum să le dezactivați" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Cum să aflați ce abonamente plătite de la Megafon sunt conectate și cum să le dezactivați</div> </a> </div> </div> <script> // <![CDATA[ $(document).ready(function() { var floatsidebar = $("#float-sidebar"); var offset = floatsidebar.offset(); var left = offset.left; var top = offset.top; var width = $("#float-sidebar").width(); var height = $("#float-sidebar").height(); $(window).scroll(function() { var scrollTop = $(window).scrollTop(); if (scrollTop >= top) { $('#float-sidebar').css({ left: left + 'px', position: 'fixed', top: "50px", width: width + "px" }); } else { $('#float-sidebar').css({ position: 'static', }); } }); }); // ]]> </script> <div id="float-sidebar"> <div id="laqybe1" style="height:500px;width:270px;" align="center"></div> </div> </aside> </div> <footer class="footer"> <div class="footer-left"> <div class="footer__logo"> <div class="footer__logo-sitename">radiobud.ru</div> </div> <div class="footer__copyright"> <p>© 2024 - radiobud.ru <br /></p> <p>Recenzii, hack-uri de viață, jocuri, programe</p> </div> <nav class="footer__nav-1"> <ul> <li class="menu-item type-post_type object-page "><a href="https://radiobud.ru/ro/sitemap.xml">Harta site-ului</a></li> </ul> </nav> </div> <nav class="footer__nav-2"><ul> <li class="menu-item type-taxonomy object-category "><a href="https://radiobud.ru/ro/feedback.html">Contacte</a></li> <li class="menu-item type-taxonomy object-category "><a href="">Publicitate</a></li> <li class="menu-item type-taxonomy object-category "><a href="">Despre site</a></li> </ul></nav> <div class="footer__counters"> </div> <div class="footer__note"></div> </footer> </div> </div> <script type='text/javascript' src='https://radiobud.ru/wp-content/themes/radiobud.ru/js/scripts.js'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js?ver=4.9.1'></script> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "smooth_scroll":"1","visibility_show":"\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c","visibility_hide":"\u0421\u043a\u0440\u044b\u0442\u044c","width":"Auto"} ; /* ]]> */ </script> <script type='text/javascript' src='https://radiobud.ru/wp-content/plugins/table-of-contents-plus/front.min.js?ver=1509'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=4.9.1'></script> <script async="async" type='text/javascript' src='https://radiobud.ru/wp-content/plugins/akismet/_inc/form.js?ver=4.0.2'></script> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> </body> </html>