Cum să lucrați cu XML - revizuirea serviciilor online și a editorilor xml

Lucrul cu date în format XMLîn aplicațiile ASP.NET 2.0, obiectul XmlDataDocument și controlul XML

Acest modul se concentrează pe modul în care puteți lucra cu date XML din aplicațiile ASP.NET.

XML înseamnă Extensible Limbajul de marcare(eXtensible Markup Language), deși XML în sine nu este un limbaj. XML este un set de reguli folosite pentru a vă crea propriile limbaje de marcare. De exemplu, imaginați-vă că avem următoarele date despre un angajat:

Aceste date, desigur, pot fi prezentate în orice mod doriți: sub forma unui tabel în baza de date relationala date, sub formă tabele Excel sau HTML, ca tabel în document Word sau în formă document text ASCII, ca fișier *.csv etc. Dacă le prezentăm în formatul limbajului de marcare compatibil cu XML ABML (Address Book Markup Language) pe care l-am inventat, ele vor arăta astfel:

Alexandru Ivanov

Nevsky pr, 1

Sankt Petersburg

555-55-55

Câteva despre cum să descifrați acest cod. Primele două rânduri sunt un prolog (folosirea lui este, în principiu, opțională, dar foarte recomandată). Linia

se numește Declarație XML și indică faptul că fișierul este conform cu specificația XML 1.0, adoptată ca recomandare de World Wide Web Consortium la 10 februarie 1998. Linia

se numește Definiție tip document și înseamnă că structura limbii căreia îi corespunde acest document este descrisă în fișierul abml.dtd (puteți folosi și DTD-uri interne atunci când descrierea limbii este localizată direct în document). În zilele noastre, mai degrabă decât DTD-urile, XML Schema este folosită mai des pentru a descrie structura limbilor compatibile cu XML - sunt mai ușor de accesat și oferă mai multe capabilități, în special atunci când descriu diferite tipuri de date. Aceeași linie care folosește XML Schema ar putea arăta astfel:

în funcție de locul în care se află Schema în sine - descrierea acestui limbaj - în fișierul abml.xml sau pe serverul Web (stocare schema corporativă de la Microsoft - BizTalk Server).

Un exemplu de schemă XML pentru limba noastră ar putea arăta astfel:

xmlns="urn:schemas-astrosoft-en:abml maxOccurs="*" />

XML este un set formalizat de reguli pentru „marcarea” unui document, adică evidențierea structurii sale logice. Ceea ce este în interiorul oricărui document compatibil XML poate fi împărțit în două categorii: marcaj și conținutul în sine. Toate informațiile de marcare trebuie să înceapă fie cu un caracter ampersand (&), fie cu un caracter paranteză unghi stânga (<). В XML существует шесть типов информации разметки: элементы, атрибуты, комментарии, инструкции обработки, ссылки на сущности и разделы CDATA.

· Elemente(elemente) este cel mai comun tip de informații de marcare. Elementul identifică o componentă logică a unui document. Un document tipic constă în etichete de deschidere și de închidere, care pot înconjura conținut, un alt element sau ambele. Etichetele cu nume de elemente sunt incluse între paranteze unghiulare. Iată un exemplu de element:

4296 Razor Hill Road

· Atribute(atributele) constau dintr-o pereche nume de atribut/valoare atribut și sunt aplicate elementelor. Atributele trebuie plasate după numele elementului în eticheta de deschidere. De exemplu, atributele sunt lățimea și înălțimea:

· Comentarii(comentarii) este orice text care va fi ignorat de procesorul XML. Exemplu:

· Instrucțiuni de procesare(instrucțiuni de procesare) sunt folosite pentru a transmite informații aplicației care procesează documentul XML. Sintaxa instrucțiunii de procesare arată astfel:

· Referințe de entitate Referințele de entități sunt folosite pentru a plasa caractere rezervate sau cuvinte rezervate într-un document. De exemplu, trebuie să inserăm un parantez unghi stâng (<), которая является зарезервированным символом XML. Просто так вставить в текст документа мы ее не сможем: приложение, работающее с документом, решит, что она относится к разметке. Поэтому нам необходимо использовать сочетание символов <. lt означает mai puțin decât(mai mic decât), iar ampersand (&) și punct și virgulă (;) evidențiază o referință de entitate.

· secțiunea CDATA(secțiunea CDATA) este o bucată de text care nu este procesată ca și restul documentului XML, ci este transmis direct aplicației. Acest instrument poate fi util, de exemplu, atunci când se transmite un cod către o aplicație.

Principii de sintaxă XML:

· Documentele XML sunt compuse din caractere Unicode (Unicode este un set de caractere pe 16 biți care permite afișarea documentelor în orice limbă).

· XML este sensibil la majuscule. Etichete Şi există diferite etichete în el.

· Spațiile albe sunt caractere invizibile, cum ar fi spațiu (ASCII 32), tab (ASCII 9), returnări de cărucior (ASCII 13) și avansuri de linie (ASCII 10). Spațiul alb este ignorat în etichete, dar este păstrat în datele de caractere (adică între etichetele de deschidere și de închidere). Spațiul alb din datele de caractere este transmis aplicației de procesare.

· Multe componente XML trebuie să aibă nume (cel mai evident exemplu fiind elementele și atributele). Regulile de denumire XML sunt următoarele: Numele XML trebuie să înceapă cu o literă sau liniuță de subliniere, urmată de orice număr de litere, cifre, cratime, litere de subliniere sau puncte, de exemplu:

My_Unique_Tag_Identifier-123 2_Acest_nume_este_incorect

· Numele componentei XML nu poate începe cu caractere xml (fie majuscule, fie minuscule). Astfel de nume sunt rezervate de creatorii specificațiilor în scopuri oficiale.

· Valorile caracterelor trebuie să fie cuprinse între ghilimele simple sau duble.

· În XML, ordinea de imbricare a etichetelor trebuie respectată cu strictețe.

· Orice etichetă de deschidere în XML trebuie să aibă o etichetă de închidere corespunzătoare.

· O etichetă goală în XML este scrisă ca o etichetă de deschidere, precedată de o bară oblică (/) înaintea parantezei unghiulare drepte.

· Nu poate exista decât un singur element rădăcină într-un document XML.

Care sunt avantajele stocării datelor în XML față de formatele binare tradiționale? De ce majoritatea producătorilor importanți de software fie trec complet la lucrul cu date într-un format compatibil XML (de exemplu, Microsoft Office 2003), fie intenționează să treacă în viitorul apropiat? Motivul principal este că datele XML sunt foarte ușor de transferat între o mare varietate de aplicații și foarte ușor de transformat. Puncte suplimentare legate de beneficiile XML:

  • Format de date independent - datele în format XML pot fi deschise în orice aplicație compatibilă cu XML (mai precis, compatibilă cu o anumită schemă). Exemplu: la orice întreprindere, documentele sunt stocate într-o varietate de formate - formate ale diferitelor versiuni de Word, text, HTML, PDF etc. Din această cauză, apar o mulțime de probleme, care pot fi rezolvate radical cu ajutorul XML.
  • Principiul general este o singură sursă de date (document XML), mai multe vizualizări. Acest lucru poate fi demonstrat clar folosind exemplul unui site Web care trebuie accesat din browsere diferite și prin WAP.
  • Transfer de date mult mai ușor „prin” aplicații. Exemple sunt trecerea documentelor printr-un lanț de aprovizionare sau trecerea datelor între produse software diferite într-o întreprindere (ceea ce este necesar foarte des).
  • Capacități îmbunătățite de căutare a datelor. În primul rând, nu este nevoie să accesați documente de diferite formate binare, iar în al doilea rând, structura ierarhică a documentelor XML facilitează căutarea.
  • Dezvoltare mai ușoară a aplicațiilor - Nu este nevoie să implementați suport pentru un număr mare de formate de date binare diferite în aplicații.
  • Datele în format text (XML - standard Unicode) sunt mai ușor decât binare de stocat pe diverse platforme și mai sigure (din punct de vedere al absenței codului binar rău intenționat) pentru a fi transmise prin rețele. O directie intreaga in dezvoltarea aplicatiilor este serviciile Web XML.

XML bine format este un cod XML care se conformează cerințelor de sintaxă ale acelui limbaj (de exemplu, fiecare etichetă de deschidere are o etichetă de închidere corespunzătoare). XML valid este valid în ceea ce privește structura logică a limbajului (de exemplu, elementele sunt imbricate corect), așa cum este definit în DTD sau Schema XML.

Un pic de terminologie XML care va fi folosit în acest curs:

· XSD - XML ​​​​Schema Definition, o descriere a structurii unui document XML folosit în mod obișnuit în VS .NET. De obicei se află în fișiere cu extensia *.xsd. Etichetele speciale sunt utilizate în interiorul schemei . Fiecare element marcat cu acest prefix aparține Schemei XML. În cadrul XML Schema puteți utiliza spații de nume. De exemplu, pentru a indica faptul că două spații de nume aparținând Schemei XML W 3C și Schemei de date Microsoft Office 10 sunt utilizate într-o schemă, puteți utiliza eticheta

xmlns:od="urn:schemas-microsoft-com:officedata">

Pentru a defini un element șir Nume într-o schemă care poate apărea de 0 sau mai multe ori într-un document, puteți, de exemplu, să utilizați următoarea etichetă:

tip="șir">

· pentru a descrie transformările documentelor compatibile cu XML, sunt folosite documente într-un limbaj de programare special XSLT (eXtensible Stylesheet Language Transform). Limbajul în sine este, desigur, și compatibil cu XML. XSLT utilizează trei tipuri de documente:

o document sursă. Acest document XML este „input” pentru transformare. În cazul nostru, acesta ar putea fi un document ca acesta:

xml-stylesheet type="text/xsl" href=" Angajații1.xsl"?>

Stuart Munson

Programator

Robert Brown

Tester

o Document de foaie de stil XSLT - un document compatibil cu XML care descrie regulile pentru efectuarea transformărilor. În cazul nostru, un exemplu al acestui document ar putea fi astfel:

xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"

versiune=" 1.0 ">



o document - rezultatul transformărilor. De exemplu, la aplicarea transformării noastre, numele angajatului va fi marcat cu roșu, iar poziția sa va fi marcată cu albastru.

· XPath este un limbaj special care poate fi folosit pentru a naviga printr-un arbore de elemente XML. Când se utilizează modelul obiect XPath, un document XML este reprezentat ca un arbore de noduri. Informațiile sunt conținute în proprietățile acestor noduri.

· DOM (Document Object Model) - reprezentarea unui arbore de document XML în RAM. DOM vă permite să navigați și să editați un document XML. Proprietățile, metodele și evenimentele DOM standard sunt definite într-un document adoptat de W3C. În ASP.NET, puteți utiliza DOM pentru a crea un document XML și a-l trimite către browserul utilizatorului. O altă opțiune este ca un script client să creeze un document XML pe client folosind DOM și să îl trimită către serverul Web.

· XQuery este un limbaj specializat pentru interogarea informațiilor stocate în documente XML. XQuery se bazează în mare parte pe XPath.

Trebuie spus că XML este un format standard pentru lucrul cu date în ADO.NET. Despre formatul XML și cum poate fi utilizat cu DataSet - mai jos.

Posibilitățile de utilizare a XML atunci când lucrați cu DataSet sunt următoarele:

· Seturile de date pot serializa datele în format XML. Schema DataSet-ului (inclusiv tabele, coloane, tipuri de date și constrângeri) este definită în Schema XML (fișier .xsd).

· schimbul de date din DataSet cu clienții la distanță este necesar să fie efectuat în format XML;

· XML poate fi folosit pentru a sincroniza și transforma datele într-un DataSet.

Mai multe despre interacțiunea dintre XML și DataSet:

· nu puteți crea doar o schemă XML bazată pe un DataSet (după cum am menționat mai sus, acest lucru se face folosind metoda WriteXmlSchema), ci și invers - generați un DataSet pe baza informațiilor din schema lor XML (pentru aceasta, utilizați ReadXmlSchema metodă). Este posibil să generați un DataSet chiar și fără o schemă - pur și simplu pe baza unui document XML. Metoda InferXmlSchema este destinată acestui scop.

· este furnizată o metodă pentru obiectul DataSet CitițiXML, care vă permite să citiți un document text XML (flux de date text XML) într-un set de date. O altă metodă ScrieXML, vă permite să salvați conținutul unui DataSet într-un format compatibil XML. Această caracteristică face foarte ușor organizarea schimbului de date între diferite aplicații și platforme.

· Puteți crea o reprezentare XML (obiect XmlDataDocument) pe baza informațiilor din DataSet. Se pare că puteți lucra cu informații dintr-un DataSet în două moduri: relațional convențional (cu DataSet-ul însuși) și metode XML. Ambele vizualizări sunt sincronizate automat (atunci când se fac modificări prin oricare dintre vizualizari).

· Puteți aplica transformări XSLT la datele care sunt stocate într-un DataSet.

Acum să vorbim despre cum arată toate acestea în practică.

Dim ds As New DataSet()

ds.ReadXml(Server.MapPath(„filename.xml”))

Metoda MapPath pentru un obiect special Server vă permite să convertiți calea virtuală a unui fișier dintr-o aplicație Web într-o cale fizică.

Dacă structura DataSet este generată automat din fișierul XML sau rămâne aceeași, depinde dacă a fost deja generată în acel DataSet și dacă a fost specificat parametrul opțional ReadXml XmlReadMode.

Dim ds As New DataSet()

Dim da As New SqlDataAdapter(_

„selectați * din autori”, conn)

da.Fill(ds)

ds.WriteXml(Server.MapPath(„filename.xml”))

Mai există două metode care vă permit să obțineți date în format XML dintr-un DataSet și să le puneți într-o variabilă șir. Acestea sunt metodele GetXml și GetXmlSchema. Un exemplu ar putea arăta astfel:

DimstrXmlDSCaString =ds.GetXml()

Un DataSet conține adesea obiecte DataTable conectate între ele prin DataRelations (adică tabele cu o cheie primară și externă). La exportul în XML, informațiile din tabelul părinte pot fi completate cu informații din tabelul copil. Înregistrările din tabelul subordonat vor apărea ca elemente imbricate pentru înregistrările din tabelul principal. Pentru a implementa această caracteristică, trebuie să setați proprietatea Nested la True pentru obiectul DataRelation din DataSet (valorul implicit este False).

Să presupunem că doar exportăm datele fără a folosi această proprietate:

Dim ds As New DataSet()

„Umpleți setul de date

...

Dim parentCol As DataColumn = _

ds.Tables(„Editori”).Columns(„pub_id”)

Dim childCol As DataColumn = _

ds.Tables(„Titluri”).Columns(„pub_id”)

ds.Relations.Add(dr)

ds.WriteXml(Server.MapPath("PubTitlesNotNested.xml"), _

XmlWriteMode.IgnoreSchema)

Codul XML arată astfel:

titlul 1

1

40.00

titlul2

2

60.00

titlu 3

1

30.00

1

pub1

2

pub2

și acum îl folosim pentru a seta proprietatea Nested pentru obiectul DataRelation la True:

Dim dr As New DataRelation _

("TitlePublishers", parentCol, childCol)

dr.Nested = Adevărat

ds.Relations.Add(dr)

ds.WriteXML(Server.MapPath("PubTitlesNested.xml"), _

XmlWriteMode.IgnoreSchema)

Codul XML se dovedește complet diferit. Fiecare element de tip Pub conține elemente Titluri lansate de acest editor:

1

pub1

titlul 1

1

40.00

titlu 3

1

30.00

2

pub2

titlul2

2

60.00

XmlDataDocument este o reprezentare XML în memorie a datelor dintr-un DataSet. Un XmlDataDocument este indisolubil legat de un DataSet. Orice modificări aduse XmlDataDocument sunt imediat reflectate în DataSet și invers. Mai jos vom vorbi despre tehnicile de lucru cu XmlDataDocument.

DataSet este o reprezentare relațională a datelor, în timp ce XmlDataDocument este ierarhic. Utilizarea XmlDataDocument este foarte convenabilă, deoarece lucrul cu date în format XML doar printr-un DataSet poate fi dificil. De exemplu, dacă încărcați date dintr-un fișier XML într-un DataSet și apoi le descărcați înapoi, se poate dovedi că fișierul va fi de nerecunoscut: formatarea se va pierde, foarte probabil ordinea elementelor, poate elementele care au fost ignorate din cauza la inconsecvență cu schema , definită pentru DataSet.

Puteți pune un document XML direct într-un XmlDataDocument sau îl puteți crea pe baza unui DataSet. Codul pentru prima opțiune ar putea arăta astfel:

Dim objXmlDataDoc ca nou XmlDataDocument()

objXmlDataDoc.Load(Server.MapPath(„fișier.xml”))

sau cam asa:

objXmlDataDoc.DataSet.ReadXml(Server.MapPath(„fișier.xml”))

Nu va fi nicio diferență.

Sau puteți crea mai întâi un DataSet, îl completați cu date și apoi creați un XmlDataDocument bazat pe acesta:

Dim ds As New DataSet()

'completați ds

...

Dim objXmlDataDoc ca nou XmlDataDocument(ds)

Odată ce obiectul XmlDataDocument este creat, puteți efectua diverse acțiuni asupra acestuia:

· leagă la DataGrid și alte controale:

dg.DataSource = objXmlDataDoc.DataSet

· obțineți șirul dorit (este returnat ca obiect XmlElement):

Dim elem Ca XmlElement

elem = objXmlDataDoc.GetElementFromRow_

(ds.Tabelele(0).Rândurile(1))

· utilizați setul complet de proprietăți și metode DOM. XmlDataDocument moștenește aceste proprietăți și metode din obiectul XmlDocument

· aplicați transformări XSLT (obiectele XslTransform sunt folosite în acest scop).

Aflați mai multe despre transformările XSLT:

XSLT vă permite să transformați un document XML sursă într-un alt document care diferă ca format și structură. De exemplu, folosind XSLT, un document XML poate fi convertit în cod HTML pentru afișare într-o aplicație Web. ASP.NET folosește clasa XslTransform pentru a efectua transformări XSLT.

Cum e să lucrezi cu el?

· pentru a efectua transformări, mai întâi trebuie să creați un DataSet și XmlDataDocument corespunzător :

Dim ds As New DataSet()

'completați DataSet

...

Dim xmlDoc ca nou XmlDataDocument(ds)

· următoarea acțiune - creați un obiect XslTransform:

Dim xslTran ca nou XslTransform()

· utilizați metoda Load a acestui obiect pentru a încărca transformarea în el:

xslTran.Load(Server.MapPath(„PubTitles.xsl”))

· creați un obiect XmlTextWriter (va fi folosit pentru a afișa rezultatele transformării):

Dim writer As New XmlTextWriter _

(Server.MapPath("PubTitles_output.html")), _

Sistem.Text.Coding.UTF8)

· Efectuăm transformarea în sine folosind metoda Transform a obiectului XslTransform. Această metodă are mai multe opțiuni. Un mod de a-l folosi ar putea arăta astfel:

xslTran.Transform(xmlDoc, Nimic, scriitor)

· închideți obiectul Writer:

scriitor.Închidere()

Pentru a lucra cu XML pe un formular Web, puteți face fără un obiect DataSet (și controale concepute pentru a afișa date dintr-o sursă relațională). În schimb, puteți utiliza XML Web Server Control. Vă permite să afișați documentele XML în sine sau rezultatele transformărilor lor pe o pagină Web. Codul XML poate fi transmis acestui control în diferite moduri:

· deschideți-le direct de pe disc (prin proprietatea DocumentSource). În acest caz (dacă nu ați aplicat transformări XSLT), documentul XML va fi scos la forma „ca atare”:

Exemplu XML

TransformSource="MyStyle.xsl" runat="server" />

· deschideți-le ca obiecte și transmiteți-le acestui control (prin proprietatea Document). În cazul nostru XML Web Controlul serverului se numește Xml1:

Private Sub Page_Load(ByVal sender As System.Object, _

ByVal e As System.EventArgs) se ocupă de MyBase.Load

Dim xmlDoc ca System.Xml.XmlDocument = _

Sistem nou.Xml.XmlDocument()

xmlDoc.Load(Server.MapPath("MySource.xml"))

Dim xslTran ca System.Xml.Xsl.XslTransform = _

Sistem nou.Xml.Xsl.XslTransform()

xslTran.Load(Server.MapPath("MyStyle.xsl"))

Xml1.Document = xmlDoc

Xml1.Transform = xslTran

End Sub

· generați pur și simplu codul XML în mod programatic și transmiteți acel cod XML către Web Server Control (prin proprietatea DocumentContent)

· în general, introduceți direct codul XML în eticheta XML Web Server Control:

Frank Miller

Judy Lew

efectuați transformarea și transferați rezultatele transformării în aceasta

Un exemplu care ilustrează toate aceste posibilități este prezentat mai jos:

Document="Obiect XmlDocument de afișat"

DocumentContent="Șir de XML"

DocumentSource="Cale către documentul XML"

Transform="Obiect XslTransform"

TransformSource="Calea către documentul de transformare XSL"

runat = "server ">

Puteți adăuga un control XML Web Server la un formular Web prin simpla glisare a acestui control din ToolBox sau prin programare:

< asp:Xmlid="xmlCtl"runat = "server " />

XmlCtl.Document.Salvați (Server.MapPath("xmlResult.xml "))

Vă prezentăm atenției un nou curs din partea echipei The Codeby- „Testarea de penetrare a aplicațiilor web de la zero”. Teorie generală, pregătirea mediului de lucru, fuzzing pasiv și amprentare, fuzzing activ, vulnerabilități, post-exploatare, instrumente, inginerie socială și multe altele.


XML DOM 2

Articolul anterior descria concepte generale referitoare la XML. În acest articol vom învăța cum să efectuăm acțiuni de bază legate de modificarea, adăugarea, căutarea într-un fișier XML.

Fișier XML care este folosit pentru exemplu.

Mazda 2007 BMW 2009

xml dom

În acest moment, fișierul nostru conține următoarea structură:

Relația dintre nodurile în XML DOM, punctele principale:

1. Orice nod din arborele DOM are un ParentNode părinte. În exemplul nostru, garajul este părintele ambelor elemente de mașină, iar ambele elemente de mașină sunt, la rândul lor, părinți ai elementelor model și an.

Cum să obțineți părintele elementului xml auto?

Console.WriteLine(elmRoot["masina"].ParentNode.Name); //Rezultat: garaj

2. Un părinte poate avea copii ChildNodes. De exemplu, pentru nodul garaj copiii sunt ambele elemente ale mașinii. Elementele mașinii au și modelul și anul de copii.

ChildNodes, este o colecție care stochează toate elementele XML pentru a accesa elementul dorit, trebuie să specificați indexul acestuia; (Indexul începe întotdeauna de la zero!)

De exemplu: cum să obțineți primul element copil?

ElmRoot.ChildNodes;

3. Ca și în viața obișnuită, un copil se poate naște primul FirstChild sau ultimul LastChild.

Dacă luăm ca exemplu elementul mașină, atunci

FirstChild este modelul LastChild este anul

4. La rândul lor, există și legături între elementele copil acestea pot fi frați sau surori, dacă facem paralele cu viața reală.

Un copil poate avea, de exemplu, un frate anterior și un frate următor

Console.WriteLine(elmRoot.ChildNodes.FirstChild.NextSibling.Name); //Rezultat: anul Console.WriteLine(elmRoot.ChildNodes.LastChild.PreviousSibling.Name); //Rezultat: model

Dacă elementul nu este găsit, atunci se aruncă o excepție: NullReferenceException, deci atunci când lucrați cu xml, folosiți întotdeauna blocurile try catch.

Console.WriteLine(elmRoot.ChildNodes. LastChild.NextSibling.Name); Console.WriteLine(elmRoot.ChildNodes. FirstChild.PreviousSibling.Name);

LastChild este NextSibling;
FirstChild este PreviousSibling;

Folosind metodele descrise mai sus, puteți trece cu ușurință la nodul dorit și puteți obține orice valoare de care aveți nevoie.

Cum să obțineți valoarea unui element xml?

Valoarea xml a unui element poate fi obținută folosind proprietatea InnerText, de exemplu:

Console.WriteLine(elmRoot["masina"].FirstChild.InnerText); //Rezultat: Mazda

O altă modalitate de a obține aceeași valoare a elementului xml:

Console.WriteLine(elmRoot.FirstChild.FirstChild.InnerText); //Rezultat: Mazda

Secvența mișcărilor de-a lungul arborelui DOM:

Garaj -> masina -> model -> Mazda

Primim anul:

ElmRoot[„mașină”].LastChild.InnerText; //Rezultat: 2007

Urmare:

Garaj -> masina -> an -> 2007

Un alt exemplu: 3 moduri de a obține același rezultat.

Console.WriteLine(elmRoot.LastChild.FirstChild.InnerText); Console.WriteLine(elmRoot["mașină"].NextSibling.FirstChild.InnerText); Console.WriteLine(elmRoot.ChildNodes.Item(1).FirstChild.InnerText); //Rezultat: BMW

Dacă trebuie să obțineți anul pentru un element cu valoarea Mazda:

Console.WriteLine(elmRoot.FirstChild.LastChild.InnerText); //Rezultat: 2007

Pentru BMW (două moduri, obțineți același rezultat)

Console.WriteLine(elmRoot.ChildNodes.Item(1).ChildNodes.Item(1).InnerText); Console.WriteLine(elmRoot.ChildNodes.ChildNodes.InnerText); //Rezultat: 2009

Cum se schimbă valorile elementelor xml?

Folosind proprietatea InnerText() Puteți să obțineți și să modificați valoarea unui element xml, de exemplu, să schimbați anul.

//Setați o nouă valoare elmRoot.FirstChild.LastChild.InnerText = "2010"; //Afișează noua valoare pe ecranul consolei Console.WriteLine(elmRoot.FirstChild.ChildNodes.Item(1).InnerText); //Rezultat: 2010

În același timp, trebuie să vă amintiți că toate modificările apar cu fișierul xml virtual dacă deschideți fișierul fizic, veți vedea că anul 2007 este încă indicat în el.

Pentru ca modificările să intre în vigoare, trebuie să utilizați metoda Salvare, de exemplu:

ElmRoot.Save ("nume fișier xml sau flux");

Acum informațiile vor fi modificate în fișierul xml „fizic”.

Cum să obțineți numărul de elemente copil?

Console.WriteLine(elmRoot.FirstChild.ChildNodes.Count);

garaj -> masina contine 2 copii: model si an

Console.WriteLine(elmRoot.FirstChild.FirstChild.ChildNodes.Count);

garaj -> mașină -> model conține 1 element xml copil.

Accesarea elementelor copil

prin index

ElmRoot.ChildNodes.Name; elmRoot.ChildNodes.Name; //Rezultat: masina

Folosind o buclă

Foreach (XmlNode nod în elmRoot.ChildNodes) ( Console.WriteLine(nod.Name); ) //Rezultat: mașină, mașină

Cum să obțineți numele elementului xml?

elmRoot.Nume; //Rezultat: garaj

Crearea unui nou element XML

Să creăm un nou element în documentul nostru XML, astfel încât să difere de celelalte două (mașină), să-l numim bus.

La crearea unui element nou, vom folosi recomandarea de pe site-ul msdn și în locul noului XmlElement standard vom folosi metoda CreateElement.

XmlElement elm = xmlDoc.CreateElement("bus");

Crearea și adăugarea unui nou element xml

Să creăm un nou element xml numit „BUS”.

XmlElement elmRoot = xmlDoc.DocumentElement; Console.WriteLine(elmRoot.ChildNodes.Count); //mașină, mașină XmlElement elmNew = xmlDoc.CreateElement("bus"); elmRoot.AppendChild(elmNew); Console.WriteLine(elmRoot.ChildNodes.Count); //3 mașină, mașină, autobuz xmlDoc.Save("nume fișier xml");

Explicaţie:

1. Mai întâi obținem un element rădăcină căruia îi vom atașa elemente noi.

2. Ca verificare, vom afișa numărul curent de elemente copii ale elementului garaj: 2 (mașină și mașină)

3. Creați un nou element BUS

4. Utilizarea metodei AppendChild adăugarea unui nou element în arbore

5. Să folosim din nou verificarea și să afișăm numărul curent de elemente pentru elementul de garaj, acum sunt 3: mașină, mașină, autobuz.

6. Pentru modificări care să afecteze fișierul fizic, salvați

În fișierul XML în sine, noul element va arăta astfel:

Cum se adaugă un nou element xml?

Sarcină: creați un nou element XML și adăugați-i conținut text, de exemplu anul de fabricație.

String strFilename = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = nou XmlDocument(); xmlDoc.Load(strFilename); XmlElement elmRoot = xmlDoc.DocumentElement; XmlElement elmNew = xmlDoc.CreateElement("bus"); XmlText new_txt = xmlDoc.CreateTextNode("2006"); elmRoot.AppendChild(elmNew); elmRoot.LastChild.AppendChild(new_txt); Console.WriteLine(elmRoot.ChildNodes.Name); //bus Console.WriteLine(elmRoot.ChildNodes.LastChild.InnerText); //2006 Console.Read();

În fișierul XML:

2006

Pentru claritate

Acum să creăm un nod „autobuz” cu aceeași arhitectură ca și mașina, adică să adăugăm noduri: model, an și conținut text.

Crearea unui element XML cu copii

string strFilename = @"C:\lecții\Auto.xml"; //creează un nou document xml în memorie XmlDocument xmlDoc = new XmlDocument(); //încărcați fișierul xml în memorie xmlDoc.Load(strFilename); //Obține elementul rădăcină XmlElement elmRoot = xmlDoc.DocumentElement; //Creează 3 elemente: bus, model, year XmlElement elmBUS = xmlDoc.CreateElement("bus"); XmlElement elmModel = xmlDoc.CreateElement("model"); XmlElement elmYear = xmlDoc.CreateElement("an"); //Setați valori pentru elemente: model, year XmlText year_txt = xmlDoc.CreateTextNode("2006"); //XmlText mod_txt = xmlDoc.CreateTextNode("liaz"); adăugați altfel //Adăugați două elemente copil la elementul magistrală: model și anul elmBUS.AppendChild(elmModel); elmBUS.AppendChild(elmYear); //Adăugați valori la nodurile model și an elmModel.InnerText = "liaz"; elmYear.AppendChild(year_txt); //Adăugați o nouă magistrală de elemente xml în arborele elmRoot.AppendChild(elmBUS); //Verificați dacă totul este adăugat așa cum ar trebui Console.WriteLine(elmRoot.ChildNodes.FirstChild.InnerText); Console.WriteLine(elmRoot.LastChild.LastChild.InnerText); //Dacă totul este în ordine, atunci folosiți metoda Salvare xmlDoc.Save("nume fișier xml");

Rezultat:

liaz 2006

Cum pot scurta acest cod? De exemplu, după cum urmează:

String PathXmlFile = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = nou XmlDocument(); xmlDoc.Load(PathXmlFile); XmlElement elmRoot = xmlDoc.DocumentElement; XmlElement elmBUS = xmlDoc.CreateElement("bus"); XmlElement elmModel = xmlDoc.CreateElement("model"); XmlElement elmYear = xmlDoc.CreateElement("an"); //Adăugați valori la nodurile model și an elmModel.InnerText = "liaz"; elmYear.InnerText = "2006"; elmBUS.AppendChild(elmModel); elmBUS.AppendChild(elmYear); elmRoot.AppendChild(elmBUS); //Dacă totul este corect, atunci apelați metoda Salvare xmlDoc.Save("nume fișier xml");

Să scurtăm codul puțin mai mult, pentru a face acest lucru vom folosi proprietatea InnerXml:

XmlDocument xmlDoc = nou XmlDocument(); xmlDoc.Load(PathXmlFile); XmlElement elmXML = xmlDoc.CreateElement("bus"); șir txt = " liaz" + "2006"; //InnerXml! elmXML.InnerXml = txt; //xmlDoc.DocumentElement (va fi egal cu garaj) - aceasta este o altă modalitate de a accesa elementul rădăcină, la fel ca XmlElement elmRoot = xmlDoc.DocumentElement; xmlDoc.DocumentElement.AppendChild ( elmXML); xmlDoc.Save(PathXmlFile);

Rezultat

Obțineți o listă de elemente folosind GetElementByTagName

GetElementByTagName revine XmlNodeList, care conține toate elementele descendente aparținând elementului specificat, de exemplu, trebuie să obținem toate modelele de mașini care sunt stocate în garaj:

XmlDocument xmlDoc = nou XmlDocument(); xmlDoc.Load(strFilename); XmlNodeList modelName = xmlDoc.GetElementsByTagName("model"); foreach (nodul XmlNode în modelName) ( Console.WriteLine(node.InnerText); ) //Rezultat: mazda, bmw, liaz

Acces folosind index:

String PathXmlFile = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = nou XmlDocument(); xmlDoc.Load(PathXmlFile); XmlNodeList modelName = xmlDoc.GetElementsByTagName("model"); Console.WriteLine(modelName.InnerText); //Rezultat: liaz

Cum pot schimba conținutul text al unui element „autobuz” nou creat folosind metoda GetElementByTagName?

String PathXmlFile = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = nou XmlDocument(); xmlDoc.Load(PathXmlFile); XmlNodeList modelName = xmlDoc.GetElementsByTagName("model"); Console.WriteLine(modelName.InnerText); //A primit valoarea: liaz

Sau poți schimba numele liaz în Ikarus

Console.WriteLine(modelName.InnerText = "Ikarus");

Ultima actualizare: 31.10.2015

Există mai multe abordări pe care le puteți folosi pentru a lucra cu XML în C#. În primele versiuni ale framework-ului, principala funcționalitate pentru lucrul cu XML a fost furnizată de spațiul de nume System.Xml. Acesta definește un număr de clase care vă permit să manipulați un document xml:

    XmlNode: reprezintă un nod xml. Întregul document sau un element separat poate fi folosit ca nod

    XmlDocument : reprezintă întregul document xml

    XmlElement: reprezintă un singur element. Moștenit din clasa XmlNode

    XmlAttribute : Reprezintă un atribut element

    XmlText: reprezintă valoarea unui element ca text, adică textul care apare în element între etichetele sale de deschidere și de închidere

    XmlComment : reprezintă un comentariu în xml

    XmlNodeList: folosit pentru a lucra cu o listă de noduri

Clasa cheie care vă permite să manipulați conținutul xml este XmlNode, așa că să ne uităm la câteva dintre principalele sale metode și proprietăți:

    Proprietatea Attributes returnează un obiect XmlAttributeCollection care reprezintă o colecție de atribute

    Proprietatea ChildNodes returnează colecția de noduri copil pentru un anumit nod

    Proprietatea HasChildNodes returnează true dacă nodul curent are noduri copil

    Proprietatea FirstChild returnează primul nod copil

    Proprietatea LastChild returnează ultimul nod copil

    Proprietatea InnerText returnează valoarea text a nodului

    Proprietatea InnerXml returnează tot markupul xml intern al nodului

    Proprietatea Name returnează numele nodului. De exemplu, - valoarea proprietății Name este „utilizator”

    Proprietatea ParentNode returnează nodul părinte al nodului curent

Să aplicăm aceste clase și funcționalitatea lor. Și mai întâi, pentru a lucra cu xml, să creăm un fișier nou. Să-l sunăm utilizatori.xmlși definiți următorul conținut în el:

Microsoft 48 Google 42

Acum să parcurgem acest document și să-i trimitem datele în consolă:

Folosind System.Xml; clasa Program ( static void Main(string args) ( XmlDocument xDoc = new XmlDocument(); xDoc.Load("users.xml"); // obține elementul rădăcină XmlElement xRoot = xDoc.DocumentElement; // traversează toate nodurile din element rădăcină foreach(XmlNode xnode în xRoot) ( // obține atributul nume if(xnode.Attributes.Count>0) ( XmlNode attr = xnode.Attributes.GetNamedItem("nume"); if (attr!=null) Consola. WriteLine(attr .Value) // traversează toate nodurile copil ale elementului user foreach(XmlNode childnode în xnode.ChildNodes) ( // dacă nodul este company if(childnode.Name=="company") ( Console.WriteLine); ("Companie: (0 )", childnode.InnerText ) // dacă nodul este vârsta if (childnode.Name == "age") ( Console.WriteLine("Age: (0)", childnode.InnerText) ; ) ) Console.WriteLine() ) Console.Read();

Ca rezultat, voi obține următoarea ieșire pe consolă:

Pentru a începe să lucrăm cu un document xml, trebuie să creăm un obiect XmlDocument și apoi să încărcăm un fișier xml în el: xDoc.Load("users.xml");

Când parsăm xml, obținem mai întâi elementul rădăcină al documentului folosind proprietatea xDoc.DocumentElement. În continuare, are loc parsarea efectivă a nodurilor documentului.

În bucla foreach(XmlNode xnode în xRoot) parcurgem toate nodurile copil ale elementului rădăcină. Deoarece nodurile copil reprezintă elemente , atunci putem obține atributele lor: XmlNode attr = xnode.Attributes.GetNamedItem("name"); și elemente imbricate: foreach(XmlNode childnode în xnode.ChildNodes)

Pentru a determina ce fel de nod se află în fața noastră, putem compara numele acestuia: if(childnode.Name=="company")

Într-un mod similar, putem crea obiecte utilizator din date xml:

Listă utilizatori = listă nouă (); XmlDocument xDoc = nou XmlDocument(); xDoc.Load("users.xml"); XmlElement xRoot = xDoc.DocumentElement; foreach(XmlElement xnode în xRoot) ( User user = new User(); XmlNode attr = xnode.Attributes.GetNamedItem("name"); if (attr!=null) user.Name=attr.Value; foreach (XmlNode childnode în xnode.ChildNodes) ( if (childnode.Name == „companie”) user.Company=childnode.InnerText; if (childnode.Name == „varsta”) user.Age = Int32.Parse(childnode.InnerText); ) utilizatori .Add(user ) foreach (Utilizator u în utilizatori) Console.WriteLine("(0) ((1)) - (2)", u.Name, u.Company, u.Age);

Scopul lucrării: dobândiți abilități practice în procesarea datelor prezentate în formatul Extensible Markup Language ( XML).

Obiectivele postului:

– studiul tehnologiei de descriere a datelor XML;

– studiul clasele principale de bibliotecă FCL, susținând prelucrarea datelor prezentate în format XM L;

– finalizați o sarcină practică privind dezvoltarea unei aplicații în C#.

Informații teoretice scurte

Format XML este o modalitate de stocare a datelor într-un format text simplu, ceea ce înseamnă că datele pot fi citite de aproape orice computer. Această împrejurare face ca acest format să fie foarte potrivit pentru utilizarea la transmiterea datelor prin Internet și poate fi chiar citit direct de către o persoană.

XML este un limbaj de marcare care poate fi folosit pentru a descrie date arbitrare. Pe baza acestui limbaj este posibil să se organizeze stocarea informațiilor și schimbul acesteia, independent fie de aplicațiile specifice, fie de platforma pe care sunt executate.

XML- documente. Setul de date completat este cunoscut în XML ca XML-document. XML-un document poate fi un fișier fizic de pe computer, sau poate fi doar o linie în memorie, dar trebuie să fie complet și să respecte anumite reguli. XML-documentul este format din mai multe părți diferite, dintre care cele mai importante sunt XML elemente care conţin datele care alcătuiesc efectiv documentul.

Microsoft. NETCadru utilizează un model de date obiect XML Obiect document Model( DOM) pentru a oferi acces la date în XML-documente și cursuri suplimentare pentru citire, scriere și navigare în interior XML-document. Aceste clase sunt suportate de spațiul de nume System.XML. Un exemplu de descriere a unui catalog de cărți în DOM este prezentat în Fig. 8.1.

Descrierea unui document XML include declarații scrise în conformitate cu cerințele sintaxei sale. La crearea XML-document, în loc să folosiți un set limitat de elemente specifice, este posibil să vă creați propriile elemente și să le atribuiți orice nume la alegerea utilizatorului. Acesta este motivul pentru care XML este extensibil. În consecință, acest limbaj poate fi folosit pentru a descrie aproape orice document: de la o partitură muzicală la o bază de date.

Catalog

Orez. 8.1. Structura ierarhică a documentului

De exemplu, un catalog de cărți ar putea fi descris așa cum se arată în Lista 8.1 (numerele rândurilor nu fac parte din document XML). Pentru a crea XML-document în mediu VizualStudio . NET ar trebui să folosești comanda Fişier\ NouFişierși selectați numele șablonului din lista verticală de șabloane XMLFişier.

Lista 8.1. Text XML-document

    C#2005 pentru profesioniști

    Christian Nagel

    1560

    800

    2006

    C# în sarcini și exemple

    Nikita Kultin

    240

    350

    2007

Rândul 1 al acestei liste conține un anunț XML, identificând textul ca document XML.În ciuda opționalității anunțului XML, documentul trebuie să îl includă pentru a identifica versiunea utilizată XML, întrucât documentul este fără declarație XML pot fi ulterior tratate ca fiind conforme cu cea mai recentă versiune de XML, ceea ce poate duce la erori. Parametru de informare versiune indică versiunea XML, utilizat în document, parametru codificare– codificarea documentelor ( utf-8).

Rândul 2 conține un comentariu care începe cu caracterele . Comentariile pot fi postate pe tot parcursul XML-document.

ÎN XML- datele documentului sunt marcate folosind etichete(elemente), care sunt nume cuprinse între paranteze unghiulare ( < > ). Etichetați numele în XML-document (cum ar fi CATALOG, CARTE,TITLU,AUTOR,PAGINI,PREŢ, PDATA din Lista 8.1) nu sunt definiții ale limbajului XML și sunt atribuite atunci când documentul este creat. Pentru etichete puteți alege orice nume specificate corect, de exemplu INVENTARîn loc de CATALOG sau ARTICOLîn loc de CARTE. Linia 3 conține eticheta rădăcină - CATALOG, care deschide marcajul întregului document. Când termină de scris eticheta rădăcină, cadrul inserează automat eticheta de final (linia 18 din Listarea 8.1), marcând-o cu simbolurile .

Nota. Încercarea de a crea mai mult de un element rădăcină în XML-documentul este o eroare.

Elementul rădăcină poate conține un număr arbitrar de elemente imbricate. În Lista 8.1 XML-documentul are o structură ierarhică sub formă de arbore cu elemente imbricate în alte elemente și cu un element de nivel superior Element de document, sau Element rădăcină(în exemplul nostru - CATALOG), care conține toate celelalte elemente. Element rădăcină CATALOG include elemente descendente CARTE. La rândul său, elementul CARTE constă din elemente descendente TITLU, AUTOR,PAGINI,PREŢ, PDATA.

Documente XML bine formate. Documentul este numit corect format(bine format) dacă îndeplinește următorul set minim de reguli pentru XML-documente:

XML-documentul trebuie să aibă un singur element rădăcină - element Document. Toate celelalte elemente trebuie să fie imbricate în elementul rădăcină;

– elementele trebuie imbricate în mod ordonat. Dacă un element începe în interiorul altui element, atunci trebuie să se termine în interiorul acelui element;

– Fiecare element trebuie să aibă o etichetă de început și de sfârșit. Spre deosebire de HTML, XML nu permite omiterea etichetei de sfârșit chiar dacă browserul este capabil să determine unde se termină elementul;

– numele elementului din eticheta de început trebuie să se potrivească exact (se face distincția între majuscule și minuscule) cu numele din eticheta de final corespunzătoare;

– numele elementului trebuie să înceapă cu o literă sau un caracter de subliniere ( _ ), urmat de litere, cifre și simboluri: punct ( . ), liniuță ( - ) sau subliniere.

Acestea sunt regulile de bază pentru formarea corectă XML-document. Alte concepte ale limbajului XML (atribute, primitive, relații) au propriile reguli care trebuie respectate. Putem spune că dacă un document este creat corect și nu apar erori la afișarea sau utilizarea acestuia, atunci acesta este un document format corect. Dacă faci o greșeală în orice etichetă HTML-page, atunci browserul va ignora pur și simplu eticheta corespunzătoare, iar eroarea se află în etichetă XML-pagina va face imposibilă afișarea acesteia. Dacă una dintre erori este prezentă, analizorul este integrat în Internet Explorer (uneori numit XML-procesor, sau parser) determină poziția acestuia

Clasele de bibliotecă FCL pentru citirea fișierelor XML. Lucrul cu XML-documentele suportă următoarele clase de bibliotecă FCL: XmlTextReader, XmlDocument, XPathNavigator.

Clasă XmlTextReader este o clasă abstractă care efectuează citirea și oferă livrare rapidă a datelor necacheate. Această abordare este cea mai puțin costisitoare în ceea ce privește resursele serverului, dar forțează recuperarea secvențială a datelor, de la început până la sfârșit.

Clasă XmlDocument reprezintă o implementare a modelului DOM. Această clasă păstrează datele în memorie după apelarea unei metode Încărca() pentru a le prelua dintr-un fișier sau flux, oferă o vizualizare arborescentă a documentului în memorie cu capabilități de navigare și editare și, de asemenea, vă permite să modificați datele și să le salvați înapoi în fișier.

Clasă XPathNavigator la fel ca clasa XmlDocument, se păstrează în memorie XML- întreg documentul. Oferă capabilități avansate de căutare a datelor, dar nu oferă posibilitatea de a face modificări sau de a le salva.

Clasă XmlTextReader. Să ne uităm la un exemplu simplu. Așezați elemente pe formular richTextBoxŞi buton(Fig. 8.2). Când faceți clic pe un buton de pe un element richTextBox Fișierul al cărui conținut a fost prezentat în Lista 8.1 va fi încărcat. Codul pentru funcția apelată când se face clic pe butonul este afișat în Lista 8.2.

Orez. 8.2. Rezultatele citirii din Xml-document

Lista 8.2. Cod de gestionare a clicului pe buton

//Curăţarea elementului richTextBox1

richTextBox1. Clar();

// Apelați o metodă statică Crea() returnarea unui obiect de clasă

// Fișier carte.xml se află în aceeași locație cu fișierul executabil

// programe

// Metoda Citire() trece la nodul următor Xml-document

în timp ce (rdr.Read())

dacă(rdr.NodeType ==XmlNodeType.Text)

richTextBox1.AppendText(rdr.Value + „\r\n”);

Clasă XmlReader poate citi și date puternic tastate. Există mai multe metode ReadElementContentAs, realizând lectura, printre care ReadElementContentAsDecimal(),ReadElementContentAsInt() ,ReadElementContentAsboolean() etc.

Lista 8.3 arată cum să citiți valorile în format zecimal și să efectuați operații matematice asupra lor. În acest caz, prețul elementului crește cu 25%. Rezultatele rulării acestui cod sunt prezentate în Fig. 8.3.

Orez. 8.3. Citirea rezultatelor din Xml - document

numai titluri și prețuri ale cărților

Lista 8.3. Citirea datelor cu verificare puternică a tipului

// Curățarea elementului richTextBox1

richTextBox1. Clar();

// Creați un flux de citit dintr-un fișier carte. xml

XmlReader rdr = XmlReader.Create("book.xml");

în timp ce (rdr.Read())

if (rdr.NodeType == XmlNodeType.Element)

// Verificarea numelui elementului

dacă (rdr. Nume == " PREŢ")

// Metoda ReadElementContentAsDecimal() execută

// convertește conținutul elementului în tip zecimal

preţ zecimal = rdr.ReadElementContentAsDecimal();

richTextBox1.AppendText("Actualpreţ= " + preț +

"freca\r\ n");

// modificarea pretului cu 25%

pret += pret * (zecimal).25;

richTextBox1.AppendText("Noupreţ= " + preț +

" freca\r\n\r\n");

else if (rdr.Name == „TITLU”)

richTextBox1.AppendText(rdr.ReadElementContentAsString() + „\r\n”);

Clasă XmlDocument. Această clasă și clasa sa derivată XmlDataDocument folosit în bibliotecă .NET pentru a reprezenta modelul obiect al documentului DOM.

Spre deosebire de clasă XmlReader, Clasa XmlDocument oferă nu numai capacități de citire, ci și de scriere, precum și acces aleatoriu la arbore DOM.

Să ne uităm la un exemplu în care este creat un obiect al unei clase XmlDocument, documentul este încărcat de pe disc și este afișată o fereastră de listă cu titlurile cărților (Fig. 8.4).

Orez. 8.4. Afișați titlurile cărților într-o listă.

În clasa formularului de aplicație, creați un obiect de clasă XmlDocument:

XmlDocument_doc = nou XmlDocument();

Codul de gestionare a clicurilor pe buton este afișat în Lista 8.4.

_doc.Load("carte.xml");

// Obțineți doar acele noduri care sunt necesare

XmlNodeListnodeLst = _ doc. GetElementsByTagName(" TITLU");

// Vizualizare în bucla de clasă XmlNodeList

pentru fiecare (XmlNodenodulînnodeLst)

listBox1. Articole. Adăuga(nodul. InnerText);

Să introducem în aplicație posibilitatea de a afișa informații despre o carte al cărei titlu este evidențiat în listă, pentru care vom adăuga un handler de evenimente listBox1_ SelectedIndexChanged așa cum se arată în Lista 8.5.

Lista 8.5. Managerul de clicuri pe elementul din listă

private void listBox1_SelectedIndexChanged (expedător obiect, EventArgs e)

// Creați un șir de căutare

string srch = "CATALOG/CARTE";

// Căutați date suplimentare

XmlNode foundNode = _doc.SelectSingleNode(srch);

dacă (foundNode != null)

MessageBox.Show(foundNode.OuterXml);

MessageBox.Show("Nu a fost găsit");

Rezultatele aplicației sunt prezentate în Fig. 8.5.

Orez. 8.5. Afișarea informațiilor despre elementul din listă selectat

Folosind o clasă XmlDocument De asemenea, puteți insera noduri într-un document existent folosind metoda Crea- Element() .

De exemplu, pentru a crea un element nou CARTE trebuie sa scrieti urmatorul cod:

XmlElement newBook ​​​​= _doc.CreateElement(„CARTE”);

Creați elemente imbricate într-un element CARTE, puteți folosi următorul cod:

// Creați un element nou AUTOR

XmlElement newAuthor = _doc.CreateElement("AUTOR");

newAuthor.InnerText = „C.Baydachny";

Codul complet al manipulatorului de clic pe buton este prezentat în Lista 8.6, rezultatele funcționării acestuia sunt prezentate în Fig. 8.6.

Lista 8.6. Manerul de clic pe buton

privatvidbuton1_ Clic(obiectexpeditor, EventArgse)

_doc.Load("carte.xml");

XmlElement newBook ​​​​= _doc.CreateElement(„CARTE”);

// Creați un element nou TITLU

XmlElement newTitle = _doc.CreateElement("TITLE");

newTitle.InnerText = „.NET Framework 2.0”;

newBook.AppendChild(newTitle);

// Creați un element nou AUTOR

XmlElement newAuthor = _doc.CreateElement("AUTOR");

newAuthor.InnerText = „C.Baydachny";

newBook.AppendChild(newAuthor);

// Creați un element nou PAGINI

XmlElement newpages = _doc.CreateElement("PAGES");

newpages.InnerText = "498";

newBook.AppendChild(pagini noi);

// Creați un element nou PREŢ

XmlElement newprice = _doc.CreateElement("PRICE");

newprice.InnerText = "590";

newBook.AppendChild(newprice);

// Creați un element nou PDATA

XmlElement newpdata = _doc.CreateElement("PDATA");

newpdata.InnerText = "2006";

newBook.AppendChild(newpdata);

// Adăugați la documentul curent

_doc.DocumentElement.AppendChild(newBook);

// Scrieți documentul pe disc

XmlTextWriter tr = new XmlTextWriter("bookEdit.xml", null);

tr.Formatting = Formatare.Indentat;

_doc.WriteContentTo(tr);

tr. Aproape();

XmlNodeListnodeLst = _ doc. GetElementsByTagName(" TITLU");

// Vedeți în bucla de clasă XmlNodeList

pentru fiecare (XmlNodenodulînnodeLst)

listBox1. Articole. Adăuga(nodul. InnerText);

Când folosiți clase XmlDocumentŞi XmlReader Trebuie luate în considerare următoarele caracteristici. Dacă aveți nevoie de acces aleatoriu la un document, ar trebui să utilizați clasa XmlDocument, iar dacă aveți nevoie de un model de threading, atunci clase bazate pe clasă XmlReader. Clasă XmlDocument este foarte flexibil, dar cerințele sale de memorie sunt mai mari decât cele ale clasei XmlReader, iar performanța la citirea unui document este mai scăzută.

Orez. 8.6. Fereastra de rulare a aplicației

cu nod adăugat

Clasă XPathNavigator. Clasă XPathNavigator face parte din spațiul de nume Sistem. Xml. XPath, conceput pentru a crește performanța. Acest spațiu oferă doar citirea documentelor, prin urmare nu există instrumente de editare în el, iar clasele sunt construite pentru a asigura o execuție rapidă pe un anumit spațiu. XML-bucle de documente și operații de selecție în stil cursor.

Cel mai bun mod de a folosi clase dintr-un spațiu de nume Sistem. Xml. XPath este vizualizarea documentelor carte. xmlîntr-un ciclu.

Așezați elemente pe formular listBoxŞibuton. Codul de gestionare a clicurilor pe buton este prezentat în Lista 8.7, rezultatele executării acestui cod sunt prezentate în Fig. 8.7.

Lista 8.7. Manerul de clic pe buton

privatvidbuton1_ Clic(obiectexpeditor, EventArgse)

// Creați un obiect cu nume doc clasă XPathDocumentși transfer

// în constructorul numelui său XML- fişier carte.xml

XPathDocument doc = new XPathDocument("book.xml");

// Creați un obiect cu nume nav clasă XPathNavigator bazat pe obiect

// XPathDocument. Obiect nav poate fi folosit doar în citire

XPathNavigator nav = ((IXPathNavigable)doc). CreateNavigator();

// Creați un obiect XPathNodeIterator pentru nodurile directoare

// și nodurile sale copil

XPathNodeIterator iter = nav.Select("/KATALOG/BOOK");

în timp ce (iter.MoveNext())

// Metoda Selectați descendenții() clasă XPathNavigator selectează totul

// nodurile descendente ale nodului curent care îndeplinesc condițiile de selecție

XPathNodeIterator newIter =

Limbajul nu este fiul, ci tatăl gândirii.
Oscar Wilde

Abreviere XMLînseamnă Extensible Markup Language, tradus ca „limbaj de marcare extensibil”. La fel ca HTML, este un subset al SGML (Standard General Markup Language), „bunicul” limbajelor de marcare. Am întâlnit formatul XML de mai multe ori. Acesta este formatul fișierelor de configurare, un fișier care descrie sursele de date obiect.

XML este un standard universal, independent de platformă, pentru descrierea informațiilor care pot fi utilizate pentru a reprezenta date ierarhice și pentru a unifica informațiile transferate. Fără cunoștințe, este imposibil să înțelegem SOAP și, prin urmare, serviciile web. XML a devenit standardul de facto pentru transmiterea datelor pe Internet. Standardul XML și formatele aferente este definit de W3C (World Wide Web Consortium). De exemplu, creăm pagini aspx în format XHTML - de tranziție între HTML și XML, al căror standard este definit și de W3C. Standardul XHTML impune reguli mai stricte privind formarea corectă a unui document, similare regulilor XML.

Să înțelegem principala diferență dintre XML și HTML. XML este conceput pentru a descrie datele și pentru a se concentra pe ceea ce este exact. HTML este conceput pentru a afișa date și se concentrează pe modul în care arată datele. Dacă în HTML tradițional, conceptele de „prezentare” și „vizualizare” sunt adesea confundate, atunci când lucrăm cu XML separăm clar aceste concepte. Etichetele XML nu sunt predefinite de creatorii limbajului, spre deosebire de etichetele HTML. Fiecare autor de document își definește propriile etichete.

Standardul cere ca un program care procesează un document XML să se oprească dacă întâlnește o eroare. Și dacă browserul detectează o etichetă neclară în HTML sau absența unei etichete de închidere, pur și simplu o ignoră.

La începutul unui document XML, declarația sau prologul acestuia apare întotdeauna. Specifică versiunea standardului XML la care se conformează.

este o eroare în XML.

Etichetele pot avea atribute. Valorile atributelor trebuie să fie cuprinse între ghilimele. Ordinea atributelor nu contează. Este posibil să existe text între etichetele de deschidere și de închidere. XML păstrează toate spațiile găsite în text. Dacă nu există text, puteți utiliza o formă abreviată de notație. Exemplu de etichetă XML:

Aceasta este o formă scurtă a etichetei

Îți amintește asta de ceva? Regulile pentru descrierea elementelor ASP.NET sunt exact aceleași.

Există un atribut xmlns care definește spațiul de nume. Valoarea sa poate fi orice nume unic. Există un acord de utilizare a adreselor URL, deoarece acestea sunt unice. Spațiile de nume au o semnificație similară modului în care sunt utilizate în .NET Framework - pentru a evita amestecarea numelor similare utilizate de diferiți dezvoltatori. Numele spațiului de nume este separat de nume prin două puncte.

Fișierele XML reprezintă informații ierarhice care pot fi reprezentate ca un arbore cu o singură rădăcină.

Documentele XML care satisfac toate cerințele de sintaxă se numesc bine formate. Pentru a descrie datele, XML folosește DTD (Document Type Definition) - o definiție a tipului de document. Dacă fișierul se potrivește cu DTD, acesta este considerat valid.

Browserele IE 6.0, FireFox 1.5 afișează fișiere XML cu evidențiere de sintaxă. Nodurile părinte pot fi extinse și închise. De exemplu, când este închis, nodul rădăcină al fișierului BirthDay.xml arată astfel:

Mediile de dezvoltare Visual Studio și VWD Express verifică corectitudinea documentelor XML chiar în timpul editării.

AdRotator

Element de control AdRotator vă permite să afișați bannere publicitare și să le înlocuiți automat cu altele. Bannerele în sine sunt descrise într-un fișier XML sau altă sursă de date. Anunțul este actualizat de fiecare dată când pagina este reîmprospătată. Proprietatea AdvertismentFile specifică numele fișierului XML. Scheletul unui fișier XML este următorul.

În interiorul nodului Advertisements există noduri

Aceste noduri au 5 atribute, toate fiind opționale.

Un exemplu de fișier AdvertismentFile, se numește ads.xml.

fix.gif http://www.im.am Gazduire gratuita 40 gazduire logo2.jpg http://www.nv.am Ziarul „Timp nou” 50 ştiri vara.jpg http://www.utro.ru Cântăreața Jasmine a fost bătută de soțul ei! 100 știri galbene

Un element de control este plasat pe pagină. Proprietatea sa AdvertisementFile indică acest fișier.

Dacă proprietatea Cuvânt cheie este setată, controlul afișează numai reclame care se potrivesc cu conținutul său. Deoarece poate fi modificat dinamic, puteți adapta publicitatea la nevoile utilizatorului. Cuvântul cheie trebuie să apară cel puțin o dată în fișierul publicitar, altfel va fi un dreptunghi gol în locul unui anunț.

În versiunile anterioare de ASP.NET, puteai lucra numai cu fișiere XML. Acum puteți utiliza orice sursă de date legând controlul sursei de date. În acest caz, trebuie să specificați cel puțin 3 câmpuri sursă în proprietățile ImageUrlField, NavigateUrlField și AlternateTextField.

Fișiere de conversie a documentelor

Se știe că CSS (Cascading Stylesheets) sunt adesea folosite pentru a formata fișierele HTML, deși acest lucru nu este necesar, deoarece browserele asociază un aspect specific tuturor etichetelor. Element

Setează paragraful - font bold - browserul știe cum să le arate.

Deoarece XML nu utilizează etichete predefinite, semnificația lor poate fi orice:

ar putea însemna un tabel HTML sau ar putea însemna o masă din lemn. Prin urmare, browserele afișează documentele XML „ca atare”. De asemenea, puteți specifica fișiere CSS pentru documentele XML, dar acest lucru nu este recomandat.

Pentru a seta formatul de afișare al documentelor XML, se folosesc foi de stil XSL. XSL- Extensible Stylesheet Language este mult mai bogat în capabilități decât CSS. XSL este mai mult decât o foaie de stil.

Același fișier XML poate fi legat la diferite tabele XSL, inclusiv în mod programatic.

XSL este format din 3 părți:

  1. XSLT - o metodă de transformare a documentelor XML
  2. XPath - o metodă pentru specificarea părților și a căilor către elemente XML
  3. Obiecte de formatare XSL - metode de formatare a documentelor XML

Cea mai importantă parte a XSL este limbajul de transformare XSLT. Este folosit pentru a transforma documente XSL în alte tipuri de documente sau alte documente XSL. XSLT este adesea folosit pentru a converti un document XSL în format HTML.

Pentru a crea un document XSLT, selectați fișierul XSLT în dialogul de creare a fișierului. VS 2005 creează un cadru de foi de stil. Deoarece o foaie de stil este ea însăși un document XML, începe cu o declarație XML.

Dacă ai studiat CSS, știi că sunt folosite reguli de stil. O regulă constă dintr-un selector și o declarație de stil între acolade.

Această etichetă conține un fișier HTML șablon. Comentariul vă reamintește că trebuie să introduceți elemente XSL acolo.

Să ne uităm la crearea fișierelor XSLT folosind un exemplu. Creați un fișier XML „Quotes.xml” în folderul App_Data

Ne-am dorit ce e mai bun, dar a ieșit ca întotdeauna. Victor Cernomyrdin America este un continent numit astfel pentru că Columb l-a descoperit. Georges Elgozy Mă înfurie să mă gândesc cât de mult aș fi învățat dacă nu aș fi fost la școală. George Bernard Shaw Se inventează multe pentru a nu gândi. Karel Capek Dacă spui adevărul, tot vei fi prins mai devreme sau mai târziu. Oscar Wilde Ar trebui să fie președinte dacă nu este spânzurat înainte de atunci. Mark Twain

Pentru a scoate transformări XSLT pentru fiecare element XML, utilizați eticheta xsl:for-each XSL. Elementul :for-each localizează elemente în documentul XML și repetă modelul pentru fiecare.

Datele pot fi sortate folosind eticheta xsl:sort, care trebuie să fie în interiorul xsl:for-each element:

Aspectul final al fișierului de transformare:

Citate celebre

Citat Autor

Dacă doriți să vedeți rezultatul transformării documentului în browser, includeți o declarație după declarația XML

,

sau selectați Afișare ieșire XML din meniul XML și specificați un fișier de transformare.

Același document XML poate fi transformat folosind un alt fișier XSL:

Maeștri ai aforismului



Rezultatul vor fi citate separate printr-o linie orizontală.

Fișiere de definiție a schemei documentului

Conform standardului modern, un document valid trebuie să se potrivească cu fișierul asociat acestuia XSD(XML Schema Definition) - Un fișier de definire a schemei XML care definește un anumit limbaj, adică descrie ce elemente și tipuri pot apărea într-un document. Schemele XSD sunt destinate să înlocuiască DTD (Document Type Definition), diferența dintre ele este că fișierele XSD în sine folosesc și sintaxa XML. Schemele XSD vă permit să determinați ce etichete sunt permise, dacă sunt necesare sau nu, dacă pot fi repetate într-un document și așa mai departe. Astfel, XML descrie datele, iar XSD descrie structura acestor date sau metadate. În termeni de programare, XSD este o descriere a tipurilor, în timp ce un fișier XML descrie obiecte de aceste tipuri. Un proiect de lucru al standardului XSD 1.1 este disponibil la http://www.w3.org/TR/2003/WD-xmlschema-11-req-20030121/.

Fișierul de definire a schemei începe cu o descriere a prefixului spațiului de nume, care este apoi inclus în toate elementele fișierului. http://tempuri.org este folosit pentru a seta URI-ul pentru spațiile de nume ASP.NET.

De exemplu, această definiție specifică că elementul „Autor” este de tip șir, trebuie să apară o dată și o singură dată, iar dacă nu este specificat, ia valoarea „Pușkin”.

Parametrul maxOccurs="unbounded" specifică faptul că elementul poate apărea de orice număr de ori.

Parametrul ref vă permite să vă referiți la un element global sau un atribut deja descris într-un fișier dat pentru a evita repetarea acelorași elemente.

  1. definiți tipuri simple și complexe.

XSD are tipuri predefinite - la fel ca .NET. Acestea sunt convertite în tipuri .NET în timp ce aplicația rulează. Pe baza acestora, puteți construi tipuri complexe similare structurilor limbajelor de programare. Un tip complex constă dintr-o secvență de declarații de elemente. Să definim un tip complex

Etichetă specifică faptul că elementele dintr-un anumit tip trebuie să apară într-o anumită ordine. Dacă eticheta ar fi folosită , atunci elementele ar putea apărea în orice ordine.

Etichetă similar cu o structură cu opțiuni. Specifică faptul că un element de un anumit tip trebuie să aibă doar unul dintre elementele sale imbricate.

Următorul exemplu definește un tip simplu imbricat în definiția elementului MyValue.

  1. Adăugați noi grupuri și grupuri de atribute.

O definiție de tip complex poate include atribute. Să presupunem că vrem să construim o schemă pentru un fișier ca acesta:

Atributele pot fi doar de tipuri simple.

  1. Adăugați adnotări.

Adnotările vă permit să inserați descrieri ale elementelor existente, adăugând astfel documentație la fișier.

Citate din diverși autori

este destinat cititorilor fișierului și pentru programele de procesare a fișierelor.

Puteți edita fișiere XSD în Visual Studio 2005 atât prin codul sursă, cât și folosind designerul. Pentru un document XML, puteți genera automat o schemă corespunzătoare. În fereastra de proprietăți ale documentului XML, puteți specifica atât un fișier de schemă, cât și un fișier de transformare. În acest caz, studioul verifică automat fișierul pentru conformitate cu schema și chiar și IntelliSense înlocuiește etichetele din acest fișier.

Clasa XmlReader

Folosind clasa XmlReader, puteți prelua date din documente XML mai rapid decât alte metode.

XmlReader este o clasă abstractă. Pentru a începe citirea, un obiect din clasa XmlReaderSettings este transmis metodei statice Create. Această funcție numără numărul de noduri dintr-un document.

folosind System.Xml;

folosind System.IO;

private int CountNodes(string xmlFile) ( int NodesCount=0; setări XmlReaderSettings = noi XmlReaderSettings(); settings.IgnoreWhitespace = true; settings.IgnoreComments = true; folosind (XmlReader reader = XmlReader.Create(xmlFile, setări)) (în timp ce (setări) reader.Read()) ( if (reader.NodeType == XmlNodeType.Element) ( NodesCount++; ) ) return NodesCount;

protected void Page_Load(object sender, EventArgs e) ( int ItemsCount = 0; zecimal DishesTotal = 0; UInt16 CaloriesTotal = 0; XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; NameTable nt = nou NameTable(); = nt.Add("food"); object price = nt.Add("price"); obiect calorii = nt.Add("string MenuFile = Path.Combine(Request.PhysicalApplicationPath , "menu.xml"); ); folosind (XmlReader reader = XmlReader.Create(MenuFile, settings)) ( while (reader.Read()) ( if (reader.NodeType == XmlNodeType.Element && food.Equals(reader.LocalName )) ( ItemsCount++; ) if (reader.NodeType == XmlNodeType.Element && price.Equals(reader.LocalName)) ( DishesTotal += (UInt16)reader.ReadElementContentAsDecimal(); ) if (reader.NodeType == XmlNodeType.Element && caloriesreader. .LocalName)) ( CaloriesTotal += (UInt16)reader.ReadElementContentAsInt(); ) ) Response.Write(String.Format(„Ați comandat (0) mese în valoare de (1:C), (2) calorii”, ItemsCount, DishesTotal , CaloriiTotal));

)

Clasa XPathDocument

Clasa oferă citirea și stocarea în memorie a documentelor XML pentru transformări folosind XSL. Puteți naviga prin document în orice direcție și puteți obține acces aleatoriu la orice element folosind expresii XPath.

<% XPathDocument doc = new XPathDocument(Server.MapPath("App_Data\\Quotes.xml")); XslCompiledTransform xsl = new XslCompiledTransform(); xsl.Load(Server.MapPath("App_Data\\Quotes.xsl")); xsl.Transform(doc, null, Response.OutputStream); %>

Să luăm documentul XML „Quotes.xml” și fișierul de transformare XSL „Quotes.xsl”. Rezultatul transformării documentului XML va fi trimis în fluxul de ieșire al paginii.

Datorită faptului că etichetele de tabel sunt definite în fișierul de transformare, pe pagină va apărea un tabel cu informațiile necesare.

Control XML

Controlul XML oferă o modalitate de a transforma un document XML folosind o foaie de stil XSL. Proprietatea DocumentSource vă permite să specificați fișierul XML în care se află datele, iar proprietatea TransformSource vă permite să specificați fișierul de transformare XSLT.

În exemplul anterior, același rezultat ar putea fi obținut prin plasarea unui control XML pe pagină.

XMLDataSource

Spre deosebire de datele tabulare dintr-un SGBD, datele din fișierele XML sunt ierarhice, astfel încât XMLDataSource este convenabil pentru a lega controalele ierarhice, cum ar fi Menu.

Sintaxă XML Data Binding

Pe măsură ce aplicațiile folosesc datele XML din ce în ce mai frecvent, a fost introdusă o metodă pentru a lega datele obținute dintr-o sursă XMLDataSource.

Aceste metode funcționează în același mod ca Bind și Eval, care au fost discutate în Lectura 7.

Să aplicăm această sintaxă unui element DataList care primește date de la un XmlDataSource:

Concluzie

În această prelegere ne-am uitat la lucrul cu date XML. XML oferă o modalitate universală de a descrie și de a schimba informații structurate, independent de aplicații și dezvoltatori. Acest lucru completează luarea în considerare a lucrului cu surse de date.