Daudziem Delphi programmētājiem iestatījumu saglabāšana ir saistīta ar lietošanu INI failus savās programmās. Jāizvairās no šīs metodes izmantošanas vairāk vai mazāk nopietnos projektos, jo tā ierobežo elastību, kas neļauj turpināt programmas paplašināšanu. Ir vērts teikt, ka šī pieeja ir diezgan populāra, pateicoties tās lietošanas vienkāršībai un iebūvēto rīku klātbūtnei izstrādes vidē.
Tomēr ideāls variants programmu iestatījumu glabāšanai ir strukturēts XML failus. To priekšrocība ir tāda, ka parametru skaits var nebūt fiksēts. Lai to labāk izprastu, apskatīsim konkrētu piemēru.
Programmā USearch, noklikšķinot uz ieraksta, tiek parādīta konteksta izvēlne, kurā tiek parādīts vienumu saraksts. Šie vienumi ir komandas, kuras savukārt tiek ielādētas no iestatījumu faila. Ja iestatījumi tika saglabāti INI failu, programma varētu saglabāt un ielādēt noteiktu skaitu instrukciju, piemēram, 10 vai 50. Tiklīdz būs nepieciešama lielāka vērtība, kods būs attiecīgi jāpārraksta un jāpārkompilē.
Pieņemot pieeju, izmantojot XML failus, varēsim dinamiski ielādēt visus sadaļu parametrus. Tam visam konfigurācijas fails kļūs elegantāks, bez pārmērīgas parametru numerācijas. tomēr standarta līdzekļi strādāt ar XML Delfos ir daudz trūkumu, tāpēc iesaku izmantot standarta bibliotēka MSXML. Parasti tas ir iekļauts pēc noklusējuma operētājsistēmas Windows saime.
Savienot MSXML, mums ir jāģenerē interfeisa fails ar visu funkciju sarakstu, importējot to no COM servera. Kā importēt interfeisu, ir uzrakstīts diezgan daudz detalizētu rakstu, taču iesaku lejupielādēt failu MSXML2_TLB.PAS jau gatavs lietošanai. Pēc faila lejupielādes novietojiet to blakus savam projektam vai nometiet Delphi vides lib mapē. Tādējādi visas izveidotās programmas varēs izmantot moduli MSXML, jums vienkārši jāpievieno rindiņa MSXML2_TLB izmantošanai .
Skaidrības labad apsveriet šādu šīs bibliotēkas izmantošanas piemēru:
LoadProcedureData; var XMLDoc: DOMDocument; Sakne: IXMLDOMElement; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("izmērs/platums").Teksts); Sakne:= nulle; XMLDoc:= nulle; beigas;
Vispirms tiek izveidots DOMDocument klases gadījums un pēc tam faila settings.xml saturs tiek ielādēts atmiņā. Tā kā saskaņā ar standartu jebkura XML failā ir jābūt saknes tagam (in Šis gadījums konfigurācija), tad mums tas jāiegūst, izmantojot funkciju Dokumenta elements. Pēc tam tiek parādīts saturs starp tagiem
Šeit tiek izmantota SelectSingleNode metode, kas kā parametru izmanto virkni
Neskatoties uz to, ka tēma par darbu ar XML Delfos ir plaši apspriesta internetā, jautājumi par šo tēmu diezgan bieži rodas visdažādākajos forumos.
Arī šo jau esmu publicējis, taču vēlos atgriezties pie reāla gadījuma, kad ātri analizēju XML failu un izvilku datus, ko es šodien darīju darbā. Man vajadzēja ne vairāk kā 5 minūtes, lai iegūtu nepieciešamos datus.
Fons. Šodien bija nepieciešams apstrādāt datus par instalētās programmas lietotāju datoros (jā, jā, mēs atklājam pirātus :)). Tehniskā nodaļa man sniedza šādu informāciju, kas iegūta no nenojaušajiem lietotājiem tīklā, izmantojot WMI. Viņu izmantotā programma ģenerē atskaites XML formātā. Attiecīgi viņi man atveda kalnu XML failu ar diezgan sarežģītu struktūru, no kuriem man vajadzēja izvilkt tikai instalēto programmatūras produktu nosaukumus. Ārstēšana . Pārskatot pāris failus manuāli, sapratu, ka novecot nebūs ilgi, un nolēmu uzrakstīt nelielu pārveidotāju. Palaižot Delphi, es repozitorijā atlasīju XML DataBinding objektu un ievadīju tam vienu no failiem. Es atstāju visus iestatījumus un parametrus pēc noklusējuma, un rezultātā es izveidoju moduli ar liels daudzums klases un saskarnes, lai piekļūtu šī XML faila elementiem. Es ilgu laiku nesāku nodarboties ar klases struktūru, nekavējoties sāku rakstīt pārveidotāju. Jaunā konsoles lietojumprogrammā es uzrakstīju diezgan vienkāršu kodu:
programma XML2TXT;
lietojumiem
veidlapas,
Klases, SysUtils,
SoftwareXML mapē "SoftwareXML.pas";
procedūra CovertXML2Text;
var
softbase: IXMLSTDSoftwareType;
i: vesels skaitlis;
sr: TSearchRec;
CurDir:string;
ExportFile: TStringList;
sākt
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
ja FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0, tad
atkārtojiet
ExportFile:= TStringList.Create;
softbase:= IelādētSTDSoftware(Pchar(CurDir+sr.Name));
i:= 0 līdz softbase.InstalledSoftware.source.software.Count — 1 do
ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);
ExportFile.Sort;
ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+.txt");
ExportFile.Free;
līdz FindNext(sr) 0;
beigas;
sākt
Pieteikums.Inicializēt;
CovertXML2Teksts;
beigas.
Tā rezultātā es saņēmu vienu mācību grāmatu katram tīkla datoram, kurā bija instalētās programmatūras saraksts.
Man šķiet, ka šis kods prasīs paskaidrojumus. Piemēram, kāpēc es izmantoju moduli Forms konsoles lietojumprogrammā un izsaucu procedūru Application.Initialize;
Patiesībā viss ir vienkārši - tas ir neliels uzlauzts, kas ļauj izmantot XML datu saistīšanu konsoles lietojumprogrammā. Jo tā spītīgi atteicās inicializēt klasi darbam ar XML. Es vēl neesmu noskaidrojis patiesos iemeslus - šodien laiks bija svarīgs, un tāpēc es pavadīju 4 no 5 minūtēm, lai cīnītos pret šo kļūdu. :) Domāju vēlāk tikt galā ar šo problēmu un uzrakstīt, kas ir īstais iemesls.
Dīvainā softbase klase tika izveidota, pamatojoties uz XML failu — tāds bija saknes elementa nosaukums, un softbase.InstalledSoftware.source.software[i].DisplayName — vienkārši pārvietojoties pa ligzdotajiem elementiem līdz vajadzīgajam un iegūstot tā vērtību.
Šādi izskatās viens no visvairāk. ātri veidi darbs ar XML Delphi.
XML arvien vairāk tiek izmantots, lai uzglabātu informāciju un apmainītos ar to starp lietojumprogrammām un vietnēm. Daudzās lietojumprogrammās šī valoda tiek izmantota kā bāzes valoda datu glabāšanai, citās - XML datu eksportēšanai un importēšanai. No tā izriet, ka izstrādātājiem ir laiks padomāt par to, kā XML datus var izmantot savās lietojumprogrammās.
Šajā rakstā mēs apskatīsim XML dokumenta objektu modeli (DOM) un Microsoft tā ieviešanu, Microsoft XML DOM.
XML DOM ir objekta modelis, kas izstrādātājam nodrošina objektus XML failu ielādei un manipulācijām ar tiem. Objekta modelis sastāv no šādiem galvenajiem objektiem: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap un XMLDOMParseError. Katrs no šiem objektiem (izņemot XMLDOMParseError) satur rekvizītus un metodes, kas ļauj iegūt informāciju par objektu, manipulēt ar objekta vērtībām un struktūru un pārvietoties pa XML dokumenta struktūru.
Apskatīsim galvenos XML DOM objektus un sniegsim dažus piemērus to izmantošanai Borland Delphi.
XML DOM izmantošana programmā Borland Delphi
Lai Delphi lietojumprogrammās izmantotu Microsoft XML DOM, savā projektā ir jāiekļauj atbilstošā tipa bibliotēka. Lai to izdarītu, mēs izpildām komandu Project | Importēt tipa bibliotēku un dialoglodziņā Importēt tipa bibliotēku atlasiet Microsoft XML versijas 2.0 (versija 2.0) bibliotēku, kas parasti atrodas failā Windows\System\MSXML.DLL.
Pēc pogas Izveidot vienību noklikšķināšanas tiks izveidots MSXML_TLB interfeisa modulis, kas ļaus izmantot XML DOM objektus: DOMDocument, XMLDocument, XMLHTTPRequest un virkni citu, kas ieviesti MSXML.DLL bibliotēkā. Sarakstā Lietošanas ir jānorāda atsauce uz MSXML_TLB moduli.
XML DOM ierīce
Dokumenta objekta modelis attēlo XML dokumentu kā koka struktūru, kas sastāv no zariem. XML DOM API ļauj lietojumprogrammām šķērsot dokumentu koku un manipulēt ar tā zariem. Katrai filiālei var būt noteikts tips (DOMNodeType), saskaņā ar kuru tiek definētas vecākzaras un atvases. Lielākajā daļā XML dokumentu jūs atradīsiet elementu, atribūtu un teksta zarus. Atribūti ir īpašs atzaru veids, un tie nav atzari. Atribūti tiek pārvaldīti. īpašas metodes, ko nodrošina XML DOM objekti.
Papildus World Wide Web Consortium (W3C) ieteikto saskarņu ieviešanai Microsoft XML DOM ietver metodes, kas atbalsta XSL, XSL modeļus, nosaukumvietas un datu tipus. Piemēram, SelectNodes metode ļauj izmantot XSL modeļa sintaksi, lai atrastu filiāles noteiktā kontekstā, un TransformNode metode atbalsta XSL izmantošanu transformāciju veikšanai.
Pārbaudiet XML dokumentu
Kā XML dokumenta piemēru ņemsim mūzikas CD-ROM direktoriju, kam ir šāda struktūra:
Tagad mēs esam gatavi sākt apskatīt XML DOM objekta modeli, ko mēs sāksim ar XMLDOMDocument objektu.
XML dokuments — XMLDOMDokumenta objekts
Darbs ar XML dokumentu sākas ar tā ielādi. Lai to izdarītu, mēs izmantojam metodi Ielādēt, kurai ir tikai viens parametrs, kas norāda ielādējamā dokumenta URL. Ielādējot failus no lokālā diska, tiek norādīts tikai pilns faila nosaukums (šajā gadījumā protokolu file:/// var izlaist). Ja XML dokuments tiek saglabāts kā virkne, lai ielādētu dokumentu, izmantojiet LoadXML metodi.
Lai kontrolētu, kā dokuments tiek ielādēts (sinhroni vai asinhroni), izmantojiet rekvizītu Async. Pēc noklusējuma šis rekvizīts ir iestatīts uz True, lai norādītu, ka dokuments tiek ielādēts asinhroni un vadība tiek atgriezta lietojumprogrammā, pirms dokuments ir pilnībā ielādēts. Pretējā gadījumā dokuments tiek ielādēts sinhroni, un pēc tam jums ir jāpārbauda rekvizīta ReadyState vērtība, lai redzētu, vai dokuments ir ielādēts. Varat arī izveidot notikumu apdarinātāju OnReadyStateChange notikumam, kas saņems kontroli, kad mainīsies rekvizīta ReadyState vērtība.
Tālāk ir parādīts, kā ielādēt XML dokumentu, izmantojot ielādes metodi:
Izmanto ... MSXML_TLB ... procedūru TForm1.Button1Click(Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATI\DATI.xml'); // // Šeit ir kods, kas manipulē // XML dokumentu un tā atzarus // XMLDoc:= Nil; beigas;
Kad dokuments ir ielādēts, mēs varam piekļūt tā rekvizītiem. Piemēram, rekvizīts NodeName satur vērtību #document, rekvizīts NodeTypeString satur vērtību dokumentu un URL rekvizīts satur vērtību file:///C:/DATA/DATA.xml.
Kļūdu apstrāde
Īpaši interesanti ir rekvizīti, kas saistīti ar dokumenta apstrādi, kad tas tiek ielādēts. Piemēram, rekvizīts ParseError atgriež XMLDOMParseError objektu, kas satur informāciju par kļūdu, kas radās dokumenta apstrādes laikā.
Lai rakstītu kļūdu apdarinātāju, varat pievienot šādu kodu:
Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; Ja XMLError.ErrorCode<>0 Tad // // Šeit mēs apstrādājam kļūdu // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nulle;
Lai uzzinātu, kāda informācija tiek atgriezta kļūdas gadījumā, mainiet šādu direktorija ierakstu:
noņemiet noslēguma elementu
Tagad ierakstīsim kodu, kas atgriež XMLDOMParseError objekta rekvizītu vērtības:
XMLError:= XMLDoc.ParseError; Ja XMLError.ErrorCode<>0 Pēc tam ar XMLError, Memo1.Lines sākas Add('File:' + URL); Add('Kods:' + IntToStr(ErrorCode)); Add('Kļūda:' + Iemesls); Add('Teksts:' + SrcTeksts); Add('Line: ' + IntToStr(Line)); Add('Position:' + IntToStr(LinePos)); beigas Else Memo1.Lines.Add(XMLDoc.XML); beigas;
un palaidiet mūsu lietojumprogrammu. Rezultātā mēs saņemam šādu kļūdu informāciju.
Kā redzams no iepriekš minētā piemēra, XMLDOMParseError objekta atgrieztā informācija ir pilnīgi pietiekama, lai atrastu kļūdu un saprastu tās rašanās iemeslu.
Tagad atjaunosim noslēguma elementu
Piekļuve dokumentu kokam
Lai piekļūtu dokumentu kokam, varat iegūt saknes elementu un pēc tam atkārtot tā pakārtotos zarus vai atrast kādu konkrētu zaru. Pirmajā gadījumā saknes elementu iegūstam caur rekvizītu DocumentElement, kas atgriež XMLDOMNode tipa objektu. Tālāk ir parādīts, kā izmantot rekvizītu DocumentElement, lai iegūtu katra pakārtotā elementa saturu.
VarNode: IXMLDOMNode; Sakne: IXMLDOMElement; I: vesels skaitlis; ... Root:= XMLDoc.DocumentElement; No I:= 0 līdz Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); beigas;
Mūsu XML dokumentam mēs iegūsim šādu tekstu.
Ja mūs interesē kāda konkrēta filiāle vai filiāle zem pirmā atzara, mēs varam izmantot vai nu metodi NodeFromID, vai XMLDOMDocument objekta metodi GetElementByTagName.
Metodei NodeFromID ir nepieciešams unikāls identifikators, kas definēts XML shēmā vai dokumenta tipa definīcijā (DTD), un atgriež filiāli ar šo identifikatoru.
Metodei GetElementByTagName ir nepieciešama virkne ar noteiktu elementu (tagu), un tā atgriež visus zarus ar šo elementu. Tālāk ir parādīts, kā izmantot šo metodi, lai atrastu visus mūsu CD-ROM direktorijā esošos māksliniekus:
Mezgli: IXMLDOMNodeList; Mezgls: IXMLDOMNode; ... Nodes:= XMLdoc.GetElementsByTagName('ARTIST'); No I:= 0 līdz Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); beigas;
Mūsu XML dokumentam mēs iegūsim šādu tekstu
Ņemiet vērā, ka XMLDOMNode objekta SelectNodes metode nodrošina elastīgāku veidu, kā piekļūt dokumentu zariem. Bet vairāk par to zemāk.
Dokumenta filiāle - XMLDOMNode objekts
XMLDOMNode objekts apzīmē dokumenta atzaru. Mēs jau esam saskārušies ar šo objektu, kad saņēmām dokumenta saknes elementu:
Root:= XMLDoc.DocumentElement;
Lai iegūtu informāciju par XML dokumenta atzaru, varat izmantot XMLDOMNode objekta rekvizītus (1. tabula).
Lai piekļūtu filiālē saglabātajiem datiem, parasti tiek izmantots rekvizīts NodeValue (pieejams atribūtiem, teksta zariem, komentāriem, apstrādes instrukcijām un CDATA sadaļām), rekvizīts Text, kas atgriež filiāles teksta saturu, vai NodeTypedValue. īpašums. Tomēr pēdējo var izmantot tikai filiālēm ar drukātiem elementiem.
Navigācija dokumentu kokā
Objekts XMLDOMNode nodrošina daudzus veidus, kā pārvietoties dokumentu kokā. Piemēram, vecākajai filiālei var piekļūt, izmantojot rekvizītu ParentNode (XMLDOMNode tips), pakārtotajiem zariem var piekļūt, izmantojot rekvizītus ChildNodes (XMLDOMNodeList tips), FirstChild un LastChild (XMLDOMNode tips) un tā tālāk. Rekvizīts OwnerDocument atgriež XMLDOMDocument tipa objektu, kas identificē pašu XML dokumentu. Iepriekš uzskaitītie rekvizīti atvieglo navigāciju dokumentu kokā.
Tagad atkārtosim visas XML dokumenta filiāles:
Root:= XMLDoc.DocumentElement; No I:= 0 līdz Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Ja Node.HasChildNodes then GetChilds(Node,0); beigas;
Kā minēts iepriekš, XMLDOMNode objekta SelectNodes nodrošina elastīgāku veidu, kā piekļūt dokumentu atzariem. Turklāt ir SelectSingleNode metode, kas atgriež tikai pirmo dokumenta atzaru. Abas šīs metodes ļauj norādīt XSL veidnes filiāļu atrašanai.
Apsveriet, kā izmantot SelectNodes metodi, lai izgūtu visas filiāles, kurām ir CD atzars un PRICE apakšnozare:
Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/CENA');
Visas CD filiāles PRICE apakšnozares tiks ievietotas Nodes kolekcijā. Mēs atgriezīsimies pie diskusijas par XSL veidnēm nedaudz vēlāk.
Manipulācijas ar bērnu zariem
Lai manipulētu ar bērnu zariem, mēs varam izmantot XMLDOMNode objekta metodes (2. tabula).
Lai pilnībā noņemtu ierakstu par pirmo disku, jums ir jāpalaiž šāds kods:
Var XMLDoc: IXMLDOMDocument; Sakne: IXMLDOMNode; Mezgls: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATI\DATI.xml'); // Iegūt saknes elementu Root:= XMLDoc.DocumentElement; Mezgls:= Sakne; // Noņemt pirmo atzaru Node.RemoveChild(Node.FirstChild);
Ņemiet vērā, ka šajā piemērā mēs dzēšam pirmo atzarojumu. Tālāk ir parādīts, kā noņemt pirmā atzara pirmo elementu:
Var XMLDoc: IXMLDOMDocument; Sakne: IXMLDOMNode; Mezgls: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATI\DATI.xml'); // Iegūt saknes elementu Root:= XMLDoc.DocumentElement; // un pirmais atzars Node:= Root.FirstChild; // Noņemt pirmo atzaru Node.RemoveChild(Node.FirstChild);
Iepriekš minētajā piemērā mēs neesam izdzēsuši pirmo filiāli
Tagad pievienosim jaunu filiāli. Tālāk ir norādīts kods, kas parāda, kā pievienot jaunu mūzikas CD-ROM ierakstu:
Var NewNode: IXMLDOMNode; Bērns: IXMLDOMNode; ... // Izveidot jaunu filiāli -
Iepriekš minētais kods parāda šādu darbību secību jaunas filiāles pievienošanai:
- Jaunas filiāles izveide, izmantojot CreateNode metodi:
- elementa izveide, izmantojot CreateNode metodi;
- elementa pievienošana zaram, izmantojot metodi AppendChild;
- elementa vērtības iestatīšana, izmantojot rekvizītu Text;
- ... atkārtojiet visiem elementiem.
- Jaunas filiāles pievienošana dokumentam, izmantojot metodi AppendChild.
Atcerieties, ka, izmantojot metodi AppendChild, koka galā tiek pievienots zars. Lai pievienotu zaru noteiktai vietai kokā, ir jāizmanto metode InsertBefore.
Nozaru kopa - XMLDOMNodeList objekts
Objektā XMLNodeList ir zaru saraksts, ko var izveidot, izmantojot SelectNodes vai GetElementsByTagName metodes, vai izgūt no rekvizīta ChildNodes.
Mēs jau esam redzējuši šī objekta izmantošanu piemērā, kas sniegts sadaļā "Navigācija dokumentu kokā". Šeit mēs sniedzam dažas teorētiskas piezīmes.
Zaru skaitu sarakstā var iegūt kā rekvizīta Length vērtību. Atzariem ir indeksi no 0 līdz Length-1, un katrs atsevišķais zars ir pieejams caur vienumu masīva elementu ar atbilstošo indeksu.
Pārvietošanos pa zaru sarakstu var veikt arī, izmantojot NextNode metodi, kas atgriež nākamo zaru sarakstā, vai nulli, ja pašreizējā filiāle ir pēdējā. Lai atgrieztos saraksta sākumā, izsauciet Reset metodi.
Izveidojiet un saglabājiet dokumentus
Tātad, mēs esam redzējuši, kā esošajiem XML dokumentiem varat pievienot filiāles un elementus. Tagad izveidosim XML dokumentu lidojumā. Pirmkārt, atcerieties, ka dokumentu var ielādēt ne tikai no URL, bet arī no parastās virknes. Tālāk ir parādīts, kā izveidot saknes elementu, ko pēc tam var izmantot, lai dinamiski izveidotu pārējos elementus (par ko mēs jau runājām sadaļā Manipulating Child Branches):
Var XMLDoc: IXMLDOMDocument; Sakne: IXMLDOMNode; Mezgls: IXMLDOMNode; S: WideString; ...S:='
Pēc XML dokumenta izveidošanas mēs to saglabājam failā, izmantojot Saglabāšanas metodi. Piemēram:
XMLDoc.Save('C:\DATA\NEWCD.XML');
Papildus saglabāšanai failā, saglabāšanas metode ļauj saglabāt XML dokumentu jaunā XMLDOMDocument objektā. Šajā gadījumā dokuments tiek pilnībā apstrādāts, un rezultātā tiek pārbaudīta tā struktūra un sintakse. Tālāk ir parādīts, kā saglabāt dokumentu citā objektā:
Procedūra TForm1.Button2Click(Sūtītājs: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nulle; beigas;
Visbeidzot, saglabāšanas metode ļauj arī saglabāt XML dokumentu citos COM objektos, kas atbalsta IStream, IPersistStream vai IPersistStreamInit saskarnes.
Izmantojot XSL veidnes
Apspriežot XMLDOMNode objekta SelectNodes metodi, mēs minējām, ka tā nodrošina elastīgāku veidu, kā piekļūt dokumentu zariem. Elastība ir tāda, ka varat norādīt XSL veidni kā zaru atlases kritēriju. Šādas veidnes nodrošina jaudīgu mehānismu informācijas atrašanai XML dokumentos. Piemēram, lai iegūtu visu mūsu katalogā esošo mūzikas CD-ROM nosaukumu sarakstu, mēs varētu izpildīt šādu vaicājumu:
Lai noskaidrotu, kuri mākslinieku kompaktdiski tika izdoti ASV, vaicājums tiek veidots šādi:
Nodes:= Root.SelectNodes('CD/IZPILDĪTĀJS');
Tālāk ir parādīts, kā direktorijā atrast pirmo disku:
Nodes:= Root.SelectNodes('CD/TITLE');
Un pēdējais:
Nodes:= Root.SelectNodes('CD/TITLE');
Lai atrastu Boba Dilana diskus, varat izpildīt šādu vaicājumu:
Nodes:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dilans"]/TITLE');
un, lai iegūtu pēc 1985. gada izdoto disku sarakstu, mēs izpildām šādu vaicājumu:
Nodes:= Root.SelectNodes('CD/TITLE');
Detalizētākai diskusijai par XSL sintakse ir nepieciešama atsevišķa ziņa. Lai ieintriģētu lasītājus un veicinātu turpmāku izpēti, es minēšu tikai vienu nelielu piemēru iespējamai XSL izmantošanai. Pieņemsim, ka mums ir jāpārvērš mūsu direktorijs par parastu HTML tabulu. Izmantojot tradicionālās metodes, mums jāiet cauri visiem koka zariem un katram saņemtajam elementam jāveido atbilstošās atzīmes.
Izmantojot XSL, mēs vienkārši izveidojam veidni (vai stila lapu), kurā norādām, ko un kā pārveidot. Pēc tam mēs ievietojam šo veidni mūsu katalogā — un esat pabeidzis: mums ir XSL veidnes teksts, kas pārvērš katalogu par tabulu (2. saraksts).
Kods XSL veidnes pārklājumam mūsu direktorijā izskatās šādi:
Procedūra TForm1.Button2Click(Sūtītājs: TObject); var XSLDoc: IXMLDOMDocument; begin XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\DATI\DATI.xsl'); Memo2.Text:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= Nulle; beigas;
Noslēdzot mūsu diskusiju par XSL, jāsaka, ka šobrīd šī valoda tiek aktīvi izmantota transformācijai starp dažādiem XML dokumentiem, kā arī dokumentu formatēšanai.
Secinājums
Acīmredzamu iemeslu dēļ nav iespējams vienā rakstā aptvert visus Microsoft XML DOM objektus un sniegt to izmantošanas piemērus. Šeit mēs esam pieskārušies tikai galvenajiem jautājumiem par XML DOM izmantošanu lietojumprogrammās. Tabulā. 3. attēlā parādīti visi objekti, kas ieviesti Microsoft XML DOM.
ComputerPress 12"2000
XML arvien vairāk tiek izmantots, lai uzglabātu informāciju un apmainītos ar to starp lietojumprogrammām un vietnēm. Daudzās lietojumprogrammās šī valoda tiek izmantota kā bāzes valoda datu glabāšanai, citās - XML datu eksportēšanai un importēšanai. No tā izriet, ka izstrādātājiem ir laiks padomāt par to, kā XML datus var izmantot savās lietojumprogrammās.
Šajā rakstā mēs apskatīsim XML dokumenta objektu modeli (DOM) un Microsoft tā ieviešanu, Microsoft XML DOM.
XML DOM ir objekta modelis, kas izstrādātājam nodrošina objektus XML failu ielādei un manipulācijām ar tiem. Objekta modelis sastāv no šādiem galvenajiem objektiem: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap un XMLDOMParseError. Katrs no šiem objektiem (izņemot XMLDOMParseError) satur rekvizītus un metodes, kas ļauj iegūt informāciju par objektu, manipulēt ar objekta vērtībām un struktūru un pārvietoties pa XML dokumenta struktūru.
Apskatīsim galvenos XML DOM objektus un sniegsim dažus piemērus to izmantošanai Borland Delphi.
XML DOM izmantošana programmā Borland Delphi
Lai Delphi lietojumprogrammās izmantotu Microsoft XML DOM, savā projektā ir jāiekļauj atbilstošā tipa bibliotēka. Lai to izdarītu, mēs izpildām komandu Project | Importēt tipa bibliotēku un dialoglodziņā Importēt tipa bibliotēku atlasiet Microsoft XML versijas 2.0 (versija 2.0) bibliotēku, kas parasti atrodas failā Windows\System\MSXML.DLL.
Pēc pogas Izveidot vienību noklikšķināšanas tiks izveidots MSXML_TLB interfeisa modulis, kas ļaus izmantot XML DOM objektus: DOMDocument, XMLDocument, XMLHTTPRequest un virkni citu, kas ieviesti MSXML.DLL bibliotēkā. Sarakstā Lietošanas ir jānorāda atsauce uz MSXML_TLB moduli.
XML DOM ierīce
Dokumenta objekta modelis attēlo XML dokumentu kā koka struktūru, kas sastāv no zariem. XML DOM API ļauj lietojumprogrammām šķērsot dokumentu koku un manipulēt ar tā zariem. Katrai filiālei var būt noteikts tips (DOMNodeType), saskaņā ar kuru tiek definētas vecākzaras un atvases. Lielākajā daļā XML dokumentu jūs atradīsiet elementu, atribūtu un teksta zarus. Atribūti ir īpašs atzaru veids, un tie nav atzari. Ar atribūtiem tiek manipulētas, izmantojot īpašas metodes, ko nodrošina XML DOM objekti.
Papildus World Wide Web Consortium (W3C) ieteikto saskarņu ieviešanai Microsoft XML DOM ietver metodes, kas atbalsta XSL, XSL modeļus, nosaukumvietas un datu tipus. Piemēram, SelectNodes metode ļauj izmantot XSL modeļa sintaksi, lai atrastu filiāles noteiktā kontekstā, un TransformNode metode atbalsta XSL izmantošanu transformāciju veikšanai.
Pārbaudiet XML dokumentu
Kā XML dokumenta piemēru ņemsim mūzikas CD-ROM direktoriju, kam ir šāda struktūra:
Tagad mēs esam gatavi sākt apskatīt XML DOM objekta modeli, ko mēs sāksim ar XMLDOMDocument objektu.
XML dokuments — XMLDOMDokumenta objekts
Darbs ar XML dokumentu sākas ar tā ielādi. Lai to izdarītu, mēs izmantojam metodi Ielādēt, kurai ir tikai viens parametrs, kas norāda ielādējamā dokumenta URL. Ielādējot failus no lokālā diska, tiek norādīts tikai pilns faila nosaukums (šajā gadījumā protokolu file:/// var izlaist). Ja XML dokuments tiek saglabāts kā virkne, lai ielādētu dokumentu, izmantojiet LoadXML metodi.
Lai kontrolētu, kā dokuments tiek ielādēts (sinhroni vai asinhroni), izmantojiet rekvizītu Async. Pēc noklusējuma šis rekvizīts ir iestatīts uz True, lai norādītu, ka dokuments tiek ielādēts asinhroni un vadība tiek atgriezta lietojumprogrammā, pirms dokuments ir pilnībā ielādēts. Pretējā gadījumā dokuments tiek ielādēts sinhroni, un pēc tam jums ir jāpārbauda rekvizīta ReadyState vērtība, lai redzētu, vai dokuments ir ielādēts. Varat arī izveidot notikumu apdarinātāju OnReadyStateChange notikumam, kas saņems kontroli, kad mainīsies rekvizīta ReadyState vērtība.
Tālāk ir parādīts, kā ielādēt XML dokumentu, izmantojot ielādes metodi:
Izmanto ... MSXML_TLB ... procedūru TForm1.Button1Click(Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATI\DATI.xml'); // // Šeit ir kods, kas manipulē // XML dokumentu un tā atzarus // XMLDoc:= Nil; beigas;
Kad dokuments ir ielādēts, mēs varam piekļūt tā rekvizītiem. Piemēram, rekvizīts NodeName satur vērtību #document, rekvizīts NodeTypeString satur vērtību dokumentu un URL rekvizīts satur vērtību file:///C:/DATA/DATA.xml.
Kļūdu apstrāde
Īpaši interesanti ir rekvizīti, kas saistīti ar dokumenta apstrādi, kad tas tiek ielādēts. Piemēram, rekvizīts ParseError atgriež XMLDOMParseError objektu, kas satur informāciju par kļūdu, kas radās dokumenta apstrādes laikā.
Lai rakstītu kļūdu apdarinātāju, varat pievienot šādu kodu:
Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; Ja XMLError.ErrorCode<>0 Tad // // Šeit mēs apstrādājam kļūdu // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nulle;
Lai uzzinātu, kāda informācija tiek atgriezta kļūdas gadījumā, mainiet šādu direktorija ierakstu:
noņemiet noslēguma elementu
Tagad ierakstīsim kodu, kas atgriež XMLDOMParseError objekta rekvizītu vērtības:
XMLError:= XMLDoc.ParseError; Ja XMLError.ErrorCode<>0 Pēc tam ar XMLError, Memo1.Lines sākas Add('File:' + URL); Add('Kods:' + IntToStr(ErrorCode)); Add('Kļūda:' + Iemesls); Add('Teksts:' + SrcTeksts); Add('Line: ' + IntToStr(Line)); Add('Position:' + IntToStr(LinePos)); beigas Else Memo1.Lines.Add(XMLDoc.XML); beigas;
un palaidiet mūsu lietojumprogrammu. Rezultātā mēs saņemam šādu kļūdu informāciju.
Kā redzams no iepriekš minētā piemēra, XMLDOMParseError objekta atgrieztā informācija ir pilnīgi pietiekama, lai atrastu kļūdu un saprastu tās rašanās iemeslu.
Tagad atjaunosim noslēguma elementu
Piekļuve dokumentu kokam
Lai piekļūtu dokumentu kokam, varat iegūt saknes elementu un pēc tam atkārtot tā pakārtotos zarus vai atrast kādu konkrētu zaru. Pirmajā gadījumā saknes elementu iegūstam caur rekvizītu DocumentElement, kas atgriež XMLDOMNode tipa objektu. Tālāk ir parādīts, kā izmantot rekvizītu DocumentElement, lai iegūtu katra pakārtotā elementa saturu.
VarNode: IXMLDOMNode; Sakne: IXMLDOMElement; I: vesels skaitlis; ... Root:= XMLDoc.DocumentElement; No I:= 0 līdz Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); beigas;
Mūsu XML dokumentam mēs iegūsim šādu tekstu.
Ja mūs interesē kāda konkrēta filiāle vai filiāle zem pirmā atzara, mēs varam izmantot vai nu metodi NodeFromID, vai XMLDOMDocument objekta metodi GetElementByTagName.
Metodei NodeFromID ir nepieciešams unikāls identifikators, kas definēts XML shēmā vai dokumenta tipa definīcijā (DTD), un atgriež filiāli ar šo identifikatoru.
Metodei GetElementByTagName ir nepieciešama virkne ar noteiktu elementu (tagu), un tā atgriež visus zarus ar šo elementu. Tālāk ir parādīts, kā izmantot šo metodi, lai atrastu visus mūsu CD-ROM direktorijā esošos māksliniekus:
Mezgli: IXMLDOMNodeList; Mezgls: IXMLDOMNode; ... Nodes:= XMLdoc.GetElementsByTagName('ARTIST'); No I:= 0 līdz Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); beigas;
Mūsu XML dokumentam mēs iegūsim šādu tekstu
Ņemiet vērā, ka XMLDOMNode objekta SelectNodes metode nodrošina elastīgāku veidu, kā piekļūt dokumentu zariem. Bet vairāk par to zemāk.
Dokumenta filiāle - XMLDOMNode objekts
XMLDOMNode objekts apzīmē dokumenta atzaru. Mēs jau esam saskārušies ar šo objektu, kad saņēmām dokumenta saknes elementu:
Root:= XMLDoc.DocumentElement;
Lai iegūtu informāciju par XML dokumenta atzaru, varat izmantot XMLDOMNode objekta rekvizītus (1. tabula).
Lai piekļūtu filiālē saglabātajiem datiem, parasti tiek izmantots rekvizīts NodeValue (pieejams atribūtiem, teksta zariem, komentāriem, apstrādes instrukcijām un CDATA sadaļām), rekvizīts Text, kas atgriež filiāles teksta saturu, vai NodeTypedValue. īpašums. Tomēr pēdējo var izmantot tikai filiālēm ar drukātiem elementiem.
Navigācija dokumentu kokā
Objekts XMLDOMNode nodrošina daudzus veidus, kā pārvietoties dokumentu kokā. Piemēram, vecākajai filiālei var piekļūt, izmantojot rekvizītu ParentNode (XMLDOMNode tips), pakārtotajiem zariem var piekļūt, izmantojot rekvizītus ChildNodes (XMLDOMNodeList tips), FirstChild un LastChild (XMLDOMNode tips) un tā tālāk. Rekvizīts OwnerDocument atgriež XMLDOMDocument tipa objektu, kas identificē pašu XML dokumentu. Iepriekš uzskaitītie rekvizīti atvieglo navigāciju dokumentu kokā.
Tagad atkārtosim visas XML dokumenta filiāles:
Root:= XMLDoc.DocumentElement; No I:= 0 līdz Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Ja Node.HasChildNodes then GetChilds(Node,0); beigas;
Kā minēts iepriekš, XMLDOMNode objekta SelectNodes nodrošina elastīgāku veidu, kā piekļūt dokumentu atzariem. Turklāt ir SelectSingleNode metode, kas atgriež tikai pirmo dokumenta atzaru. Abas šīs metodes ļauj norādīt XSL veidnes filiāļu atrašanai.
Apsveriet, kā izmantot SelectNodes metodi, lai izgūtu visas filiāles, kurām ir CD atzars un PRICE apakšnozare:
Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/CENA');
Visas CD filiāles PRICE apakšnozares tiks ievietotas Nodes kolekcijā. Mēs atgriezīsimies pie diskusijas par XSL veidnēm nedaudz vēlāk.
Manipulācijas ar bērnu zariem
Lai manipulētu ar bērnu zariem, mēs varam izmantot XMLDOMNode objekta metodes (2. tabula).
Lai pilnībā noņemtu ierakstu par pirmo disku, jums ir jāpalaiž šāds kods:
Var XMLDoc: IXMLDOMDocument; Sakne: IXMLDOMNode; Mezgls: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATI\DATI.xml'); // Iegūt saknes elementu Root:= XMLDoc.DocumentElement; Mezgls:= Sakne; // Noņemt pirmo atzaru Node.RemoveChild(Node.FirstChild);
Ņemiet vērā, ka šajā piemērā mēs dzēšam pirmo atzarojumu. Tālāk ir parādīts, kā noņemt pirmā atzara pirmo elementu:
Var XMLDoc: IXMLDOMDocument; Sakne: IXMLDOMNode; Mezgls: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATI\DATI.xml'); // Iegūt saknes elementu Root:= XMLDoc.DocumentElement; // un pirmais atzars Node:= Root.FirstChild; // Noņemt pirmo atzaru Node.RemoveChild(Node.FirstChild);
Iepriekš minētajā piemērā mēs neesam izdzēsuši pirmo filiāli
Tagad pievienosim jaunu filiāli. Tālāk ir norādīts kods, kas parāda, kā pievienot jaunu mūzikas CD-ROM ierakstu:
Var NewNode: IXMLDOMNode; Bērns: IXMLDOMNode; ... // Izveidot jaunu filiāli -
Iepriekš minētais kods parāda šādu darbību secību jaunas filiāles pievienošanai:
- Jaunas filiāles izveide, izmantojot CreateNode metodi:
- elementa izveide, izmantojot CreateNode metodi;
- elementa pievienošana zaram, izmantojot metodi AppendChild;
- elementa vērtības iestatīšana, izmantojot rekvizītu Text;
- ... atkārtojiet visiem elementiem.
- Jaunas filiāles pievienošana dokumentam, izmantojot metodi AppendChild.
Atcerieties, ka, izmantojot metodi AppendChild, koka galā tiek pievienots zars. Lai pievienotu zaru noteiktai vietai kokā, ir jāizmanto metode InsertBefore.
Nozaru kopa - XMLDOMNodeList objekts
Objektā XMLNodeList ir zaru saraksts, ko var izveidot, izmantojot SelectNodes vai GetElementsByTagName metodes, vai izgūt no rekvizīta ChildNodes.
Mēs jau esam redzējuši šī objekta izmantošanu piemērā, kas sniegts sadaļā "Navigācija dokumentu kokā". Šeit mēs sniedzam dažas teorētiskas piezīmes.
Zaru skaitu sarakstā var iegūt kā rekvizīta Length vērtību. Atzariem ir indeksi no 0 līdz Length-1, un katrs atsevišķais zars ir pieejams caur vienumu masīva elementu ar atbilstošo indeksu.
Pārvietošanos pa zaru sarakstu var veikt arī, izmantojot NextNode metodi, kas atgriež nākamo zaru sarakstā, vai nulli, ja pašreizējā filiāle ir pēdējā. Lai atgrieztos saraksta sākumā, izsauciet Reset metodi.
Izveidojiet un saglabājiet dokumentus
Tātad, mēs esam redzējuši, kā esošajiem XML dokumentiem varat pievienot filiāles un elementus. Tagad izveidosim XML dokumentu lidojumā. Pirmkārt, atcerieties, ka dokumentu var ielādēt ne tikai no URL, bet arī no parastās virknes. Tālāk ir parādīts, kā izveidot saknes elementu, ko pēc tam var izmantot, lai dinamiski izveidotu pārējos elementus (par ko mēs jau runājām sadaļā Manipulating Child Branches):
Var XMLDoc: IXMLDOMDocument; Sakne: IXMLDOMNode; Mezgls: IXMLDOMNode; S: WideString; ...S:='
Pēc XML dokumenta izveidošanas mēs to saglabājam failā, izmantojot Saglabāšanas metodi. Piemēram:
XMLDoc.Save('C:\DATA\NEWCD.XML');
Papildus saglabāšanai failā, saglabāšanas metode ļauj saglabāt XML dokumentu jaunā XMLDOMDocument objektā. Šajā gadījumā dokuments tiek pilnībā apstrādāts, un rezultātā tiek pārbaudīta tā struktūra un sintakse. Tālāk ir parādīts, kā saglabāt dokumentu citā objektā:
Procedūra TForm1.Button2Click(Sūtītājs: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nulle; beigas;
Visbeidzot, saglabāšanas metode ļauj arī saglabāt XML dokumentu citos COM objektos, kas atbalsta IStream, IPersistStream vai IPersistStreamInit saskarnes.
Izmantojot XSL veidnes
Apspriežot XMLDOMNode objekta SelectNodes metodi, mēs minējām, ka tā nodrošina elastīgāku veidu, kā piekļūt dokumentu zariem. Elastība ir tāda, ka varat norādīt XSL veidni kā zaru atlases kritēriju. Šādas veidnes nodrošina jaudīgu mehānismu informācijas atrašanai XML dokumentos. Piemēram, lai iegūtu visu mūsu katalogā esošo mūzikas CD-ROM nosaukumu sarakstu, mēs varētu izpildīt šādu vaicājumu:
Lai noskaidrotu, kuri mākslinieku kompaktdiski tika izdoti ASV, vaicājums tiek veidots šādi:
Nodes:= Root.SelectNodes('CD/IZPILDĪTĀJS');
Tālāk ir parādīts, kā direktorijā atrast pirmo disku:
Nodes:= Root.SelectNodes('CD/TITLE');
Un pēdējais:
Nodes:= Root.SelectNodes('CD/TITLE');
Lai atrastu Boba Dilana diskus, varat izpildīt šādu vaicājumu:
Nodes:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dilans"]/TITLE');
un, lai iegūtu pēc 1985. gada izdoto disku sarakstu, mēs izpildām šādu vaicājumu:
Nodes:= Root.SelectNodes('CD/TITLE');
Detalizētākai diskusijai par XSL sintakse ir nepieciešama atsevišķa ziņa. Lai ieintriģētu lasītājus un veicinātu turpmāku izpēti, es minēšu tikai vienu nelielu piemēru iespējamai XSL izmantošanai. Pieņemsim, ka mums ir jāpārvērš mūsu direktorijs par parastu HTML tabulu. Izmantojot tradicionālās metodes, mums jāiet cauri visiem koka zariem un katram saņemtajam elementam jāveido atbilstošās atzīmes.
Izmantojot XSL, mēs vienkārši izveidojam veidni (vai stila lapu), kurā norādām, ko un kā pārveidot. Pēc tam mēs ievietojam šo veidni mūsu katalogā — un esat pabeidzis: mums ir XSL veidnes teksts, kas pārvērš katalogu par tabulu (2. saraksts).
Kods XSL veidnes pārklājumam mūsu direktorijā izskatās šādi:
Procedūra TForm1.Button2Click(Sūtītājs: TObject); var XSLDoc: IXMLDOMDocument; begin XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\DATI\DATI.xsl'); Memo2.Text:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= Nulle; beigas;
Noslēdzot mūsu diskusiju par XSL, jāsaka, ka šobrīd šī valoda tiek aktīvi izmantota transformācijai starp dažādiem XML dokumentiem, kā arī dokumentu formatēšanai.
Secinājums
Acīmredzamu iemeslu dēļ nav iespējams vienā rakstā aptvert visus Microsoft XML DOM objektus un sniegt to izmantošanas piemērus. Šeit mēs esam pieskārušies tikai galvenajiem jautājumiem par XML DOM izmantošanu lietojumprogrammās. Tabulā. 3. attēlā parādīti visi objekti, kas ieviesti Microsoft XML DOM.
ComputerPress 12"2000
Sveicu visus! Vairākus gadus es rakstīju Matlab, un tad man bija nepacietība rakstīt programmu Delfos.
Man jāiemācās strādāt ar xml dokumentiem. Es strādāju RAD Stiduo XE3. Ir TXMLDocument komponents, ko droši vien zina daudzi Delphi programmētāji. Šķiet, ka viņš var daudz. Bet problēma ir tā, ka tam nav skaidras dokumentācijas un apraksta. Palīdzība RAD Studio ir miskaste, jo tur nav normālas informācijas; tikai niecīga palīdzība, kas izkaisīta pa lapām par dažām metodēm un procedūrām (bez piemēriem un parasta apraksta). Izrakstīja visu internetu. Atradu tikai tēmas forumos ar konkrētiem uzdevumiem, kur vēl stundu jāmin, ko dara tā vai cita rinda, kas saistīta ar piekļūšanu xml failam.
Man ir nepieciešama arī rokasgrāmata par galvenajām funkcijām, procedūrām un metodēm, kas tiek izmantotas, strādājot ar xml. Mācību grāmata, rokasgrāmata, apraksts. Vai vismaz "xml delfos manekeniem". Piemēram:
Lai atvērtu xml failu, izmantojiet metodi XMLDocument1.LoadFromFile("filemane.xml"), kur faila nosaukums ir faila nosaukums.
IXMLNode tipa mezglu saraksta mainīgais tiek izmantots, lai saglabātu pakārtoto elementu sarakstu. Lai noteiktu šo sarakstu, izmantojiet metodi Xmldocument1.DocumentElement (kur XMLDocument1 ir pārbaudāmais xml fails).
Lai vaicātu bērna elementa "element1" saturu, izmantojiet metodi XMLDocument1.DocumentElement.ChildNodes[ "element1"].Text....
un šajā garā tālāk par visām izmantotajām metodēm, procedūrām, datu veidiem.
Kur es varu atrast šādas rokasgrāmatas/aprakstus? Kurš var palīdzēt?
Ja nepieciešams konkrēts uzdevums, aprakstīšu.
Man ir šāds xml dokuments:
kāds teksts
kāds kļūdas teksts
Cits kļūdas teksts
Programmas kodā mums ir:
var
...
vecāks, bērns1: IXMLNode;
sākt
XMLDocument1.LoadFromFile("f:\filename.xml");
XMLDocument1.Active:=true;
.
.
beigas
Kas jums jāiemācās darīt:
(Jau iepriekš atvainojos, ja nepareizi nosaucu xml dokumenta komponentus)
1. Iegūstiet saknes elementa nosaukumu (mūsu gadījumā ltm), kā arī tā atribūtu sarakstu (versiju, veidu) un to vērtības ("1.0", "iestatījumi").
2. Iegūstiet elementu skaitu, kas ir saknes bērni. Šajā gadījumā ir 7 no tiem: veidneFaili, izmēri, tīklājs, tīklājs, dati, dati, dati. Iegūstiet elementu (tagu) nosaukumus (veidnes faili, izmēri utt.). Pēc elementu skaita iegūšanas un to nosaukumu iegūšanas es cilpu no 0 uz count-1 un darīšu to, kas man vajadzīgs.
3. Iegūstiet vajadzīgā elementa atribūtu skaitu un sarakstu. Piemēram, karstā punkta elementam. Pareizā atbilde būtu 4 atribūti. Pirmajam tīklāja elementam tie būs nosaukums, stils, scena, ath. Otrajam - tas pats, tikai ath atribūta vietā - rz atribūts.
Ņemiet vērā, ka failā ir 2 tīklāja elementi ar dažādiem atribūtiem. Lūk, kā ar tiem strādāt (ja ir vairāk nekā 1 viena nosaukuma elementi)?
Es tā vēlos: es saņemu bērnu elementu sarakstu uz rel. uz saknes vienu (skat. 2. punktu), izlaižu tiem cilpu ar for un atrodu hotspot elementus, kuru nosaukuma parametrs ir vienāds ar vajadzīgo (saki "hs015_2" - tāds elements noteikti būs). Vai ir kāds veids, kā atrisināt šo problēmu bez cilpas? Tas nozīmē, vai iegūt atribūta scena vērtību tīklāja elementam, kuram ir name="hs015_2"?
4. Veiciet iepriekš minēto attiecībā uz mezgliem un elementiem, kas ir bērnu bērni. Manā piemērā mezgls (bērns un vecāks un.
Ja pareizi saprotu, vajag kaut kā pārsūtīt mezgla saturu uz tipa mainīgais IXMLNode un rīkojieties tāpat kā 1.–3. Tātad?
5. Jums jāiemācās mainīt augstāk minētos parametrus (iestatiet savus).
Šķiet, ka pagaidām tas arī viss. Šajā posmā sintaktiskās konstrukcijas man ir vissvarīgākās.
Kam pieder šī tēma, lūdzu uzrakstiet citas sintaktiskās konstrukcijas, lai atrisinātu augstāk minētos jautājumus (kā iegūt atribūtus, to skaitu, elementu skaitu, nosaukumus utt.). Tagad galvenais ir apgūt sintaksi, un es vēlāk ieviesīšu savu algoritmu. Jau iepriekš liels paldies visiem!
P.S. Es tiešām negribētu rakstīt savu XML parseri no nulles tikai tāpēc, ka nav normāla apraksta esošajiem.