Paljude Delphi programmeerijate jaoks on sätete salvestamine seotud kasutamisega INI failid oma programmides. Selle meetodi kasutamist rohkem või vähem tõsiste projektide puhul tuleks vältida, kuna see piirab paindlikkust, mis takistab programmi edasist laiendamist. Väärib märkimist, et see lähenemisviis on kasutusmugavuse ja sisseehitatud tööriistade olemasolu tõttu arenduskeskkonnas üsna populaarne.
Ideaalne võimalus programmi sätete salvestamiseks on aga struktureeritud XML failid. Nende eeliseks on see, et parameetrite arv ei pruugi olla fikseeritud. Selle paremaks mõistmiseks vaatame konkreetset näidet.
USearchi programmis kuvatakse kirjel klõpsamisel kontekstimenüü, milles kuvatakse üksuste loend. Need üksused on käsud, mis omakorda laaditakse seadete failist. Kui sätted olid salvestatud INI faili, võib programm salvestada ja laadida teatud arvu juhiseid, näiteks 10 või 50. Niipea kui on vaja suuremat väärtust, tuleb kood vastavalt ümber kirjutada ja uuesti kompileerida.
Kasutades lähenemist kasutades XML failid, saame kõik jaotise parameetrid dünaamiliselt laadida. Selle kõige jaoks muutub konfiguratsioonifail elegantsemaks, ilma parameetrite liigse nummerdamiseta. Kuid, standardsed vahendid koos töötada XML Delphis on palju puudusi, seega soovitan kasutada standardne raamatukogu MSXML. Tavaliselt on see vaikimisi kaasatud operatsioonisüsteemid Windowsi perekond.
Ühendama MSXML, peame genereerima liidesefaili kõigi funktsioonide loendiga, importides selle COM-serverist. Liidese importimise kohta on kirjutatud üsna palju üksikasjalikke artikleid, kuid ma soovitan teil faili alla laadida MSXML2_TLB.PAS juba kasutusvalmis. Pärast faili allalaadimist asetage see oma projekti kõrvale või pukseerige see Delphi keskkonna lib kausta. Seega saavad moodulit kasutada kõik loodud programmid MSXML, peate lihtsalt lisama rea MSXML2_TLB kasutusaladele.
Selguse huvides vaadake selle teegi kasutamise kohta järgmist näidet:
LoadProcedureData; var XMLDoc: DOMDocument; Juur: IXMLDOMElement; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("suurus/laius").Tekst); Juur:= null; XMLDoc:= null; lõpp;
Esmalt luuakse klassi DOMDocument eksemplar ja seejärel laaditakse faili settings.xml sisu mällu. Kuna standardi järgi mis tahes XML fail peab sisaldama juurmärget (in sel juhul konfig), siis peame selle funktsiooni abil hankima Dokumendielement. Seejärel kuvatakse siltide vahel olev sisu
Siin kasutatakse SelectSingleNode meetodit, mis võtab parameetrina stringi
Hoolimata asjaolust, et Delphis XML-iga töötamise teemat on Internetis palju arutatud, tekib selleteemalisi küsimusi igasugustes foorumites.
Olen ka selle juba postitanud, kuid tahaksin naasta reaalse XML-faili kiire sõelumise ja andmete ekstraktimise juhtumi juurde, mida ma täna tööl tegin. Mul ei kulunud vajalike andmete hankimiseks rohkem kui 5 minutit.
Taust. Täna oli vaja töödelda andmeid installitud programmid kasutajate arvutites (jah, jah, me tuvastame piraadid :)). Tehniline osakond andis mulle sellise pahaaimamatutelt kasutajatelt WMI-d kasutava võrgu kaudu rippitud teabe. Nende kasutatud programm genereerib aruandeid XML-vormingus. Sellest tulenevalt tõid nad mulle mäe üsna keeruka struktuuriga XML-faile, millest mul oli vaja välja võtta ainult installitud tarkvaratoodete nimed. Ravi . Pärast paari faili käsitsi ülevaatamist mõistsin, et vananemine ei võta kaua aega, ja otsustasin kirjutada väikese konverteri. Delphi käivitamisel valisin hoidlast XML DataBinding objekti ja andsin sellele ühe faili. Jätsin kõik seaded ja parameetrid vaikimisi ning selle tulemusena moodustasin mooduli suur kogus klassid ja liidesed, et pääseda juurde selle XML-faili elementidele. Ma ei hakanud klassistruktuuriga pikka aega tegelema, asusin kohe konverterit kirjutama. Uues konsoolirakenduses kirjutasin üsna lihtsa koodi:
programm XML2TXT;
kasutab
vormid,
Klassid, SysUtils,
SoftwareXML failis "SoftwareXML.pas";
protseduur CovertXML2Text;
var
softbase: IXMLSTDSoftwareType;
i: täisarv;
sr: TSearchRec;
CurDir:string;
Ekspordifail: TStringList;
alustada
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
kui FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0, siis
korda
ExportFile:= TStringList.Create;
softbase:= Laadi STDtarkvara(Pchar(CurDir+sr.Name));
i:= 0 puhul softbase.InstalledSoftware.source.software.Count – 1 do
ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);
ExportFile.Sort;
ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.serverinimi+.txt");
ExportFile.Free;
kuni FindNext(sr) 0;
lõpp;
alustada
Rakendus.Initsialiseeri;
CovertXML2Tekst;
lõpp.
Selle tulemusena sain iga ruudustiku arvuti kohta ühe õpiku, mis sisaldab installitud tarkvara loendit.
Arvan, et see kood vajab selgitusi. Näiteks miks ma kasutasin konsoolirakenduses moodulit Forms ja kutsusin välja protseduuri Application.Initialize;
Tegelikult on kõik lihtne – see on väike häkkimine, mis võimaldab kasutada XML Data Bindingut konsoolirakenduses. Sest see keeldus kangekaelselt klassi initsialiseerimast XML-iga töötamiseks. Ma ei ole veel aru saanud tegelikest põhjustest – täna oli aeg oluline ja seetõttu kulutasin 4 minutist viiest selle veaga võitlemisele. :) Mõtlen hiljem selle probleemiga tegeleda ja kirjutada, mis on tegelik põhjus.
Kummaline softbase klass loodi XML-faili põhjal – see oli juurelemendi nimi, ja softbase.InstalledSoftware.source.software[i].DisplayName – lihtsalt navigeerides läbi pesastatud elementide soovitud failini ja hankides selle väärtuse.
Nii näeb välja üks enim. kiired viisid XML-iga töötamine Delphis.
XML-i kasutatakse üha enam teabe salvestamiseks ja selle vahetamiseks rakenduste ja veebisaitide vahel. Paljudes rakendustes kasutatakse seda keelt andmete salvestamise baaskeelena, teistes - XML-andmete eksportimiseks ja importimiseks. Sellest järeldub, et arendajatel on aeg mõelda, kuidas saaks XML-andmeid enda rakendustes kasutada.
Selles artiklis vaatleme XML-dokumenti Objektimudel(DOM) ja selle juurutamine Microsofti poolt – Microsoft XML DOM.
XML DOM on objektimudel, mis pakub arendajale objekte XML-failide laadimiseks ja manipuleerimiseks. Objektimudel koosneb järgmistest põhiobjektidest: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap ja XMLDOMParseError. Kõik need objektid (välja arvatud XMLDOMParseError) sisaldavad atribuute ja meetodeid, mis võimaldavad teil saada teavet objekti kohta, manipuleerida objekti väärtuste ja struktuuriga ning navigeerida XML-dokumendi struktuuris.
Vaatame peamisi XML DOM-objekte ja toome mõned näited nende kasutamisest Borland Delphis.
XML DOM-i kasutamine Borland Delphis
Microsoft XML DOM-i kasutamiseks Delphi rakendustes peate oma projekti kaasama vastava tüübiteegi. Selleks täidame käsu Project | Impordi tüübiteek ja dialoogiboksis Import Type Library valige Microsoft XML-i versiooni 2.0 (versioon 2.0) teek, mis asub tavaliselt failis Windows\System\MSXML.DLL
Pärast nupu Loo ühik klõpsamist luuakse MSXML_TLB liidese moodul, mis võimaldab kasutada XML DOM-objekte: DOMDocument, XMLDocument, XMLHTTPRequest ja mitmeid teisi MSXML.DLL teegis realiseeritud. Kasutamiste loendis tuleb määrata viide moodulile MSXML_TLB.
XML DOM seade
Dokumendiobjektimudel kujutab XML-dokumenti okstest koosneva puustruktuurina. XML DOM API-d võimaldavad rakendustel dokumendipuud läbida ja selle harusid manipuleerida. Igal harul võib olla kindel tüüp (DOMNodeType), mille järgi määratakse vanem- ja alamharud. Enamikus XML-dokumentides leiate elemendi-, atribuudi- ja tekstiharud. Atribuudid on haru eriliik ega ole alamharud. Atribuute hallatakse. erimeetodid, mida pakuvad XML DOM-objektid.
Lisaks World Wide Web Consortium (W3C) soovitatud liideste rakendamisele sisaldab Microsoft XML DOM meetodeid, mis toetavad XSL-i, XSL-mustreid, nimeruume ja andmetüüpe. Näiteks võimaldab SelectNodes-meetod kasutada XSL-i mustri süntaksit, et leida harusid konkreetses kontekstis, ja meetod TransformNode toetab XSL-i kasutamist teisenduste tegemiseks.
Testige XML-dokumenti
Võtame XML-dokumendi näitena muusika CD-ROMi kataloogi, millel on järgmine struktuur:
Nüüd oleme valmis alustama XML-i DOM-i objektimudeli vaatamist, mida alustame objektiga XMLDOMDocument.
XML-dokument – XMLDOMDokumendi objekt
XML-dokumendiga töötamine algab selle laadimisega. Selleks kasutame meetodit Laadi, millel on ainult üks parameeter, mis määrab laaditava dokumendi URL-i. Failide laadimisel kohalikult kettalt määratakse ainult täielik failinimi (protokolli file:/// võib sel juhul ära jätta). Kui XML-dokument on salvestatud stringina, peaksite dokumendi laadimiseks kasutama LoadXML-i meetodit.
Dokumendi laadimise (sünkroonne või asünkroonne) juhtimiseks kasutage atribuuti Async. Vaikimisi on selle atribuudi väärtuseks määratud Tõene, mis näitab, et dokument laaditakse asünkroonselt ja juhtimine naaseb rakendusse enne dokumendi täielikku laadimist. Vastasel juhul laaditakse dokument sünkroonselt ja seejärel peate kontrollima atribuudi ReadyState väärtust, et näha, kas dokument on laaditud või mitte. Samuti saate sündmuse OnReadyStateChange jaoks luua sündmuste töötleja, mis saab kontrolli, kui atribuudi ReadyState väärtus muutub.
Järgmine näitab, kuidas laadida XML-dokumenti laadimismeetodi abil.
Kasutab ... MSXML_TLB ... protseduuri TForm1.Button1Click(Saatja: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // // Siin on kood, mis manipuleerib // XML-dokumenti ja selle harusid // XMLDoc:= Nil; lõpp;
Pärast dokumendi laadimist pääseme juurde selle atribuutidele. Näiteks atribuut NodeName sisaldab väärtust #document, atribuut NodeTypeString sisaldab väärtusdokumenti ja URL-i atribuut väärtust file:///C:/DATA/DATA.xml.
Vigade käsitlemine
Eriti huvitavad on atribuudid, mis on seotud dokumendi töötlemisega selle laadimisel. Näiteks atribuut ParseError tagastab objekti XMLDOMParseError, mis sisaldab teavet dokumendi töötlemisel ilmnenud tõrke kohta.
Veakäsitleja kirjutamiseks saate lisada järgmise koodi:
Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\ANDMED\DATA.xml'); XMLError:= XMLDoc.ParseError; Kui XMLError.ErrorCode<>0 Seejärel // // Siin käsitleme viga // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Null;
Et teada saada, millist teavet vea korral tagastatakse, muutke järgmist kataloogi kirjet:
eemaldage sulgemiselement
Nüüd kirjutame koodi, mis tagastab objekti XMLDOMParseError atribuudi väärtused:
XMLError:= XMLDoc.ParseError; Kui XMLError.ErrorCode<>0 Seejärel algab XMLErrori abil Memo1.Lines Add('Fail:' + URL); Add('Kood:' + IntToStr(ErrorCode)); Add('Viga:' + Põhjus); Add('Tekst:' + SrcText); Add('Line: ' + IntToStr(Line)); Add('Positsioon:' + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); lõpp;
ja käivitage meie rakendus. Selle tulemusena saame järgmise veateabe.
Nagu ülaltoodud näitest näha, piisab tõrke eraldamiseks ja selle esinemise põhjuse mõistmiseks objekti XMLDOMParseError tagastatud teabest.
Nüüd taastame sulgemise elemendi
Juurdepääs dokumendipuule
Dokumendipuule juurdepääsemiseks võite hankida juurelemendi ja seejärel itereerida selle alamharude kaudu või leida mõne konkreetse haru. Esimesel juhul saame juurelemendi läbi atribuudi DocumentElement, mis tagastab XMLDOMNode tüüpi objekti. Järgmine näitab, kuidas kasutada atribuuti DocumentElement iga alamelemendi sisu hankimiseks.
VarNode: IXMLDOMNode; Juur: IXMLDOMElement; I: täisarv; ... Root:= XMLDoc.DocumentElement; Kui I:= 0 kuni Root.ChildNodes.Length-1, tehke Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Sõlm.Tekst); lõpp;
Meie XML-dokumendi jaoks saame järgmise teksti.
Kui meid huvitab konkreetne haru või esimesest alamharust allpool olev haru, saame kasutada kas meetodit NodeFromID või objekti XMLDOMDocument meetodit GetElementByTagName.
Meetod NodeFromID nõuab unikaalset identifikaatorit, mis on määratletud XML-skeemis või dokumenditüübi definitsioonis (DTD) ja tagastab selle identifikaatoriga haru.
Meetod GetElementByTagName nõuab kindla elemendiga (sildiga) stringi ja tagastab kõik selle elemendiga harud. Järgnevalt on näidatud, kuidas seda meetodit kasutada meie CD-ROMi kataloogist kõigi artistide leidmiseks:
Sõlmed: IXMLDOMNodeList; Sõlm: IXMLDOMNode; ... Nodes:= XMLDoc.GetElementsByTagName('ARTIST'); Kui I:= 0 kuni Nodes.Length-1, tehke Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Sõlm.Tekst); lõpp;
Meie XML-dokumendi jaoks saame järgmise teksti
Pange tähele, et XMLDOMNode objekti SelectNodes meetod pakub paindlikumat viisi dokumendiharudele juurdepääsuks. Aga sellest lähemalt allpool.
Dokumendi haru – XMLDOMNode objekt
XMLDOMNode objekt esindab dokumendi haru. Oleme selle objektiga juba kokku puutunud, kui saime dokumendi juurelemendi:
Root:= XMLDoc.DocumentElement;
Teabe saamiseks XML-dokumendi haru kohta saate kasutada XMLDOMNode objekti atribuute (tabel 1).
Harus salvestatud andmetele juurdepääsuks kasutatakse tavaliselt kas atribuuti NodeValue (saadaval atribuutide, tekstiharude, kommentaaride, töötlemisjuhiste ja CDATA jaotiste jaoks), atribuuti Text, mis tagastab haru tekstisisu, või atribuuti NodeTypedValue. . Viimast saab aga kasutada ainult trükitud elementidega harude jaoks.
Dokumendipuus navigeerimine
Objekt XMLDOMNode pakub palju võimalusi dokumendipuus navigeerimiseks. Näiteks pääseb emaharule juurde atribuudi ParentNode (tüüp XMLDOMNode) kaudu, alamharudele pääseb juurde atribuutide ChildNodes (tüüp XMLDOMNodeList), FirstChild ja LastChild (tüüp XMLDOMNode) kaudu jne. Atribuut OwnerDocument tagastab XMLDOMDocument tüüpi objekti, mis tuvastab XML-dokumendi enda. Ülaltoodud atribuudid muudavad dokumendipuus navigeerimise lihtsaks.
Nüüd korrakem läbi kõik XML-dokumendi harud:
Root:= XMLDoc.DocumentElement; Kui I:= 0 kuni Root.ChildNodes.Length-1, tehke Begin Node:= Root.ChildNodes.Item[I]; If Node.HasChildNodes then GetChilds(Node,0); lõpp;
Nagu eespool märgitud, pakub XMLDOMNode objekti SelectNodes paindlikum viis juurdepääsuks dokumendi harudele. Lisaks on SelectSingleNode meetod, mis tagastab ainult dokumendi esimese haru. Mõlemad meetodid võimaldavad määrata harude leidmiseks XSL-malle.
Kaaluge meetodi SelectNodes kasutamist kõigi CD haru ja PRICE alamharu omavate harude toomiseks:
Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');
Kõik CD-haru PRICE alamharud paigutatakse Nodesi kogusse. Naaseme XSL-mallide arutelu juurde veidi hiljem.
Manipuleerimine alamharudega
Alamharudega manipuleerimiseks saame kasutada XMLDOMNode objekti meetodeid (tabel 2).
Esimese ketta kirje täielikuks eemaldamiseks peate käivitama järgmise koodi:
Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // Hangi juurelement Root:= XMLDoc.DocumentElement; Sõlm:= Juur; // Eemalda esimene alamharu Node.RemoveChild(Node.FirstChild);
Pange tähele, et selles näites kustutame esimese alamharu. Esimese alamharu esimese elemendi eemaldamine on näidatud allpool:
Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // Hangi juurelement Root:= XMLDoc.DocumentElement; // ja esimene alamharu Node:= Root.FirstChild; // Eemalda esimene alamharu Node.RemoveChild(Node.FirstChild);
Ülaltoodud näites ei ole me esimest haru kustutanud
Nüüd lisame uue haru. Allpool on kood, mis näitab, kuidas lisada uus muusika-CD-ROM-i kirje:
Var NewNode: IXMLDOMNode; Laps: IXMLDOMNode; ... // Loo uus haru -
Ülaltoodud kood näitab uue haru lisamiseks järgmist toimingute jada:
- Uue haru loomine CreateNode meetodil:
- elemendi loomine CreateNode meetodil;
- elemendi lisamine harule, kasutades meetodit AppendChild;
- elemendi väärtuse määramine atribuudi Text kaudu;
- ... korrake kõigi elementide puhul.
- Dokumendile uue haru lisamine meetodil AppendChild.
Tuletame meelde, et AppendChild meetod lisab puu lõppu haru. Selleks, et lisada puu kindlasse kohta oksa, tuleb kasutada meetodit InsertBefore.
Harukomplekt – objekt XMLDOMNodeList
Objekt XMLNodeList sisaldab harude loendit, mille saab luua meetoditega SelectNodes või GetElementsByTagName või hankida atribuudist ChildNodes.
Oleme juba näinud selle objekti kasutamist jaotises "Dokumendipuus navigeerimine" toodud näites. Siin esitame mõned teoreetilised märkused.
Nimekirjas olevate harude arvu saab Pikkus omaduse väärtusena. Harudel on indeksid vahemikus 0 kuni Length-1 ja igale üksikule harule pääseb juurde vastava indeksiga elemendi massiivi elemendi kaudu.
Harude loendis liikumiseks saab kasutada ka meetodit NextNode, mis tagastab loendis järgmise haru või nulli, kui praegune haru on viimane. Loendi algusesse naasmiseks helistage lähtestamismeetodile.
Looge ja salvestage dokumente
Niisiis, oleme näinud, kuidas saate olemasolevatele XML-dokumentidele harusid ja elemente lisada. Nüüd loome käigult XML-dokumendi. Kõigepealt pidage meeles, et dokumenti saab laadida mitte ainult URL-ist, vaid ka tavalisest stringist. Järgnevalt näidatakse, kuidas luua juurelementi, mida saab seejärel kasutada ülejäänud elementide dünaamiliseks konstrueerimiseks (mida me juba käsitlesime jaotises Manipulating Child Branches):
Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; S: WideString; ...S:='
Pärast XML-dokumendi koostamist salvestame selle meetodi Salvesta abil faili. Näiteks:
XMLDoc.Save('C:\ANDMED\NEWCD.XML');
Lisaks faili salvestamisele võimaldab salvestamismeetod salvestada XML-dokumendi uude XMLDOMDocument-objekti. Sel juhul töödeldakse dokument täielikult ja selle tulemusena kontrollitakse selle struktuuri ja süntaksit. Järgmine näitab, kuidas dokumenti mõnes teises objektis salvestada.
Protseduur TForm1.Button2Click(Saatja: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= null; lõpp;
Lõpuks võimaldab salvestamismeetod salvestada XML-dokumendi ka teistele COM-objektidele, mis toetavad liideseid IStream, IPersistStream või IPersistStreamInit.
XSL-mallide kasutamine
XMLDOMNode objekti SelectNodes meetodi käsitlemisel mainisime, et see pakub paindlikumat viisi dokumendiharudele juurdepääsuks. Paindlikkus seisneb selles, et saate harude valimise kriteeriumina määrata XSL-malli. Sellised mallid pakuvad võimsat mehhanismi teabe leidmiseks XML-dokumentidest. Näiteks kõigi meie kataloogis olevate muusika-CD-ROM-ide pealkirjade loendi saamiseks võime käivitada järgmise päringu:
Et teada saada, milliste artistide CD-d USA-s välja anti, moodustatakse päring järgmiselt:
Nodes:= Root.SelectNodes('CD/ARTIST');
Järgmine näitab, kuidas leida kataloogist esimene draiv:
Nodes:= Root.SelectNodes('CD/TITLE');
Ja viimaseks:
Nodes:= Root.SelectNodes('CD/TITLE');
Bob Dylani plaatide leidmiseks võite käivitada järgmise päringu:
Nodes:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');
ja pärast 1985. aastat välja antud plaatide loendi saamiseks käivitame järgmise päringu:
Nodes:= Root.SelectNodes('CD/TITLE');
XSL-i süntaksi üksikasjalikum arutelu nõuab eraldi postitust. Lugejate intrigeerimiseks ja edasise uurimistöö julgustamiseks toon vaid ühe väikese näite XSL-i võimalikust kasutamisest. Oletame, et peame oma kataloogi teisendama tavaliseks HTML-tabeliks. Traditsioonilisi meetodeid kasutades peame läbima kõik puu oksad ja moodustama iga saadud elemendi jaoks vastavad sildid.
XSL-i kasutades loome lihtsalt malli (või stiililehe), milles täpsustame, mida ja kuidas teisendada. Seejärel rakendame selle malli oma kataloogile – ja oletegi: meil on XSL-malli tekst, mis teisendab kataloogi tabeliks (loetelu 2).
Kood XSL-malli katmiseks meie kataloogis näeb välja järgmine:
Protseduur TForm1.Button2Click(Saatja: TObject); var XSLDoc: IXMLDOMDokument; begin XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\ANDMED\DATA.xsl'); Memo2.Tekst:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= null; lõpp;
XSL-i arutelu lõpetuseks olgu öeldud, et praegu kasutatakse seda keelt aktiivselt nii erinevate XML-dokumentide vahel teisendamiseks kui ka dokumentide vormindamiseks.
Järeldus
Arusaadavatel põhjustel on võimatu ühes artiklis katta kõiki Microsoft XML DOM-i objekte ja tuua näiteid nende kasutamise kohta. Siin oleme puudutanud ainult XML-DOM-i rakendustes kasutamise põhiprobleeme. Tabelis. Joonis 3 näitab kõiki Microsoft XML DOM-is rakendatud objekte.
ComputerPress 12"2000
XML-i kasutatakse üha enam teabe salvestamiseks ja selle vahetamiseks rakenduste ja veebisaitide vahel. Paljudes rakendustes kasutatakse seda keelt andmete salvestamise baaskeelena, teistes - XML-andmete eksportimiseks ja importimiseks. Sellest järeldub, et arendajatel on aeg mõelda, kuidas saaks XML-andmeid enda rakendustes kasutada.
Selles artiklis vaatleme XML-dokumendiobjekti mudelit (DOM) ja Microsofti selle rakendamist, Microsoft XML DOM-i.
XML DOM on objektimudel, mis pakub arendajale objekte XML-failide laadimiseks ja manipuleerimiseks. Objektimudel koosneb järgmistest põhiobjektidest: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap ja XMLDOMParseError. Kõik need objektid (välja arvatud XMLDOMParseError) sisaldavad atribuute ja meetodeid, mis võimaldavad teil saada teavet objekti kohta, manipuleerida objekti väärtuste ja struktuuriga ning navigeerida XML-dokumendi struktuuris.
Vaatame peamisi XML DOM-objekte ja toome mõned näited nende kasutamisest Borland Delphis.
XML DOM-i kasutamine Borland Delphis
Microsoft XML DOM-i kasutamiseks Delphi rakendustes peate oma projekti kaasama vastava tüübiteegi. Selleks täidame käsu Project | Impordi tüübiteek ja dialoogiboksis Import Type Library valige Microsoft XML-i versiooni 2.0 (versioon 2.0) teek, mis asub tavaliselt failis Windows\System\MSXML.DLL
Pärast nupu Loo ühik klõpsamist luuakse MSXML_TLB liidese moodul, mis võimaldab kasutada XML DOM-objekte: DOMDocument, XMLDocument, XMLHTTPRequest ja mitmeid teisi MSXML.DLL teegis realiseeritud. Kasutamiste loendis tuleb määrata viide moodulile MSXML_TLB.
XML DOM seade
Dokumendiobjektimudel kujutab XML-dokumenti okstest koosneva puustruktuurina. XML DOM API-d võimaldavad rakendustel dokumendipuud läbida ja selle harusid manipuleerida. Igal harul võib olla kindel tüüp (DOMNodeType), mille järgi määratakse vanem- ja alamharud. Enamikus XML-dokumentides leiate elemendi-, atribuudi- ja tekstiharud. Atribuudid on haru eriliik ega ole alamharud. Atribuutidega manipuleeritakse XML-i DOM-objektide pakutavate erimeetodite abil.
Lisaks World Wide Web Consortium (W3C) soovitatud liideste rakendamisele sisaldab Microsoft XML DOM meetodeid, mis toetavad XSL-i, XSL-mustreid, nimeruume ja andmetüüpe. Näiteks võimaldab SelectNodes-meetod kasutada XSL-i mustri süntaksit, et leida harusid konkreetses kontekstis, ja meetod TransformNode toetab XSL-i kasutamist teisenduste tegemiseks.
Testige XML-dokumenti
Võtame XML-dokumendi näitena muusika CD-ROMi kataloogi, millel on järgmine struktuur:
Nüüd oleme valmis alustama XML-i DOM-i objektimudeli vaatamist, mida alustame objektiga XMLDOMDocument.
XML-dokument – XMLDOMDokumendi objekt
XML-dokumendiga töötamine algab selle laadimisega. Selleks kasutame meetodit Laadi, millel on ainult üks parameeter, mis määrab laaditava dokumendi URL-i. Failide laadimisel kohalikult kettalt määratakse ainult täielik failinimi (protokolli file:/// võib sel juhul ära jätta). Kui XML-dokument on salvestatud stringina, peaksite dokumendi laadimiseks kasutama LoadXML-i meetodit.
Dokumendi laadimise (sünkroonne või asünkroonne) juhtimiseks kasutage atribuuti Async. Vaikimisi on selle atribuudi väärtuseks määratud Tõene, mis näitab, et dokument laaditakse asünkroonselt ja juhtimine naaseb rakendusse enne dokumendi täielikku laadimist. Vastasel juhul laaditakse dokument sünkroonselt ja seejärel peate kontrollima atribuudi ReadyState väärtust, et näha, kas dokument on laaditud või mitte. Samuti saate sündmuse OnReadyStateChange jaoks luua sündmuste töötleja, mis saab kontrolli, kui atribuudi ReadyState väärtus muutub.
Järgmine näitab, kuidas laadida XML-dokumenti laadimismeetodi abil.
Kasutab ... MSXML_TLB ... protseduuri TForm1.Button1Click(Saatja: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // // Siin on kood, mis manipuleerib // XML-dokumenti ja selle harusid // XMLDoc:= Nil; lõpp;
Pärast dokumendi laadimist pääseme juurde selle atribuutidele. Näiteks atribuut NodeName sisaldab väärtust #document, atribuut NodeTypeString sisaldab väärtusdokumenti ja URL-i atribuut väärtust file:///C:/DATA/DATA.xml.
Vigade käsitlemine
Eriti huvitavad on atribuudid, mis on seotud dokumendi töötlemisega selle laadimisel. Näiteks atribuut ParseError tagastab objekti XMLDOMParseError, mis sisaldab teavet dokumendi töötlemisel ilmnenud tõrke kohta.
Veakäsitleja kirjutamiseks saate lisada järgmise koodi:
Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\ANDMED\DATA.xml'); XMLError:= XMLDoc.ParseError; Kui XMLError.ErrorCode<>0 Seejärel // // Siin käsitleme viga // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Null;
Et teada saada, millist teavet vea korral tagastatakse, muutke järgmist kataloogi kirjet:
eemaldage sulgemiselement
Nüüd kirjutame koodi, mis tagastab objekti XMLDOMParseError atribuudi väärtused:
XMLError:= XMLDoc.ParseError; Kui XMLError.ErrorCode<>0 Seejärel algab XMLErrori abil Memo1.Lines Add('Fail:' + URL); Add('Kood:' + IntToStr(ErrorCode)); Add('Viga:' + Põhjus); Add('Tekst:' + SrcText); Add('Line: ' + IntToStr(Line)); Add('Positsioon:' + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); lõpp;
ja käivitage meie rakendus. Selle tulemusena saame järgmise veateabe.
Nagu ülaltoodud näitest näha, piisab tõrke eraldamiseks ja selle esinemise põhjuse mõistmiseks objekti XMLDOMParseError tagastatud teabest.
Nüüd taastame sulgemise elemendi
Juurdepääs dokumendipuule
Dokumendipuule juurdepääsemiseks võite hankida juurelemendi ja seejärel itereerida selle alamharude kaudu või leida mõne konkreetse haru. Esimesel juhul saame juurelemendi läbi atribuudi DocumentElement, mis tagastab XMLDOMNode tüüpi objekti. Järgmine näitab, kuidas kasutada atribuuti DocumentElement iga alamelemendi sisu hankimiseks.
VarNode: IXMLDOMNode; Juur: IXMLDOMElement; I: täisarv; ... Root:= XMLDoc.DocumentElement; Kui I:= 0 kuni Root.ChildNodes.Length-1, tehke Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Sõlm.Tekst); lõpp;
Meie XML-dokumendi jaoks saame järgmise teksti.
Kui meid huvitab konkreetne haru või esimesest alamharust allpool olev haru, saame kasutada kas meetodit NodeFromID või objekti XMLDOMDocument meetodit GetElementByTagName.
Meetod NodeFromID nõuab unikaalset identifikaatorit, mis on määratletud XML-skeemis või dokumenditüübi definitsioonis (DTD) ja tagastab selle identifikaatoriga haru.
Meetod GetElementByTagName nõuab kindla elemendiga (sildiga) stringi ja tagastab kõik selle elemendiga harud. Järgnevalt on näidatud, kuidas seda meetodit kasutada meie CD-ROMi kataloogist kõigi artistide leidmiseks:
Sõlmed: IXMLDOMNodeList; Sõlm: IXMLDOMNode; ... Nodes:= XMLDoc.GetElementsByTagName('ARTIST'); Kui I:= 0 kuni Nodes.Length-1, tehke Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Sõlm.Tekst); lõpp;
Meie XML-dokumendi jaoks saame järgmise teksti
Pange tähele, et XMLDOMNode objekti SelectNodes meetod pakub paindlikumat viisi dokumendiharudele juurdepääsuks. Aga sellest lähemalt allpool.
Dokumendi haru – XMLDOMNode objekt
XMLDOMNode objekt esindab dokumendi haru. Oleme selle objektiga juba kokku puutunud, kui saime dokumendi juurelemendi:
Root:= XMLDoc.DocumentElement;
Teabe saamiseks XML-dokumendi haru kohta saate kasutada XMLDOMNode objekti atribuute (tabel 1).
Harus salvestatud andmetele juurdepääsuks kasutatakse tavaliselt kas atribuuti NodeValue (saadaval atribuutide, tekstiharude, kommentaaride, töötlemisjuhiste ja CDATA jaotiste jaoks), atribuuti Text, mis tagastab haru tekstisisu, või atribuuti NodeTypedValue. . Viimast saab aga kasutada ainult trükitud elementidega harude jaoks.
Dokumendipuus navigeerimine
Objekt XMLDOMNode pakub palju võimalusi dokumendipuus navigeerimiseks. Näiteks pääseb emaharule juurde atribuudi ParentNode (tüüp XMLDOMNode) kaudu, alamharudele pääseb juurde atribuutide ChildNodes (tüüp XMLDOMNodeList), FirstChild ja LastChild (tüüp XMLDOMNode) kaudu jne. Atribuut OwnerDocument tagastab XMLDOMDocument tüüpi objekti, mis tuvastab XML-dokumendi enda. Ülaltoodud atribuudid muudavad dokumendipuus navigeerimise lihtsaks.
Nüüd korrakem läbi kõik XML-dokumendi harud:
Root:= XMLDoc.DocumentElement; Kui I:= 0 kuni Root.ChildNodes.Length-1, tehke Begin Node:= Root.ChildNodes.Item[I]; If Node.HasChildNodes then GetChilds(Node,0); lõpp;
Nagu eespool märgitud, pakub XMLDOMNode objekti SelectNodes paindlikum viis juurdepääsuks dokumendi harudele. Lisaks on SelectSingleNode meetod, mis tagastab ainult dokumendi esimese haru. Mõlemad meetodid võimaldavad määrata harude leidmiseks XSL-malle.
Kaaluge meetodi SelectNodes kasutamist kõigi CD haru ja PRICE alamharu omavate harude toomiseks:
Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');
Kõik CD-haru PRICE alamharud paigutatakse Nodesi kogusse. Naaseme XSL-mallide arutelu juurde veidi hiljem.
Manipuleerimine alamharudega
Alamharudega manipuleerimiseks saame kasutada XMLDOMNode objekti meetodeid (tabel 2).
Esimese ketta kirje täielikuks eemaldamiseks peate käivitama järgmise koodi:
Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // Hangi juurelement Root:= XMLDoc.DocumentElement; Sõlm:= Juur; // Eemalda esimene alamharu Node.RemoveChild(Node.FirstChild);
Pange tähele, et selles näites kustutame esimese alamharu. Esimese alamharu esimese elemendi eemaldamine on näidatud allpool:
Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // Hangi juurelement Root:= XMLDoc.DocumentElement; // ja esimene alamharu Node:= Root.FirstChild; // Eemalda esimene alamharu Node.RemoveChild(Node.FirstChild);
Ülaltoodud näites ei ole me esimest haru kustutanud
Nüüd lisame uue haru. Allpool on kood, mis näitab, kuidas lisada uus muusika-CD-ROM-i kirje:
Var NewNode: IXMLDOMNode; Laps: IXMLDOMNode; ... // Loo uus haru -
Ülaltoodud kood näitab uue haru lisamiseks järgmist toimingute jada:
- Uue haru loomine CreateNode meetodil:
- elemendi loomine CreateNode meetodil;
- elemendi lisamine harule, kasutades meetodit AppendChild;
- elemendi väärtuse määramine atribuudi Text kaudu;
- ... korrake kõigi elementide puhul.
- Dokumendile uue haru lisamine meetodil AppendChild.
Tuletame meelde, et AppendChild meetod lisab puu lõppu haru. Selleks, et lisada puu kindlasse kohta oksa, tuleb kasutada meetodit InsertBefore.
Harukomplekt – objekt XMLDOMNodeList
Objekt XMLNodeList sisaldab harude loendit, mille saab luua meetoditega SelectNodes või GetElementsByTagName või hankida atribuudist ChildNodes.
Oleme juba näinud selle objekti kasutamist jaotises "Dokumendipuus navigeerimine" toodud näites. Siin esitame mõned teoreetilised märkused.
Nimekirjas olevate harude arvu saab Pikkus omaduse väärtusena. Harudel on indeksid vahemikus 0 kuni Length-1 ja igale üksikule harule pääseb juurde vastava indeksiga elemendi massiivi elemendi kaudu.
Harude loendis liikumiseks saab kasutada ka meetodit NextNode, mis tagastab loendis järgmise haru või nulli, kui praegune haru on viimane. Loendi algusesse naasmiseks helistage lähtestamismeetodile.
Looge ja salvestage dokumente
Niisiis, oleme näinud, kuidas saate olemasolevatele XML-dokumentidele harusid ja elemente lisada. Nüüd loome käigult XML-dokumendi. Kõigepealt pidage meeles, et dokumenti saab laadida mitte ainult URL-ist, vaid ka tavalisest stringist. Järgnevalt näidatakse, kuidas luua juurelementi, mida saab seejärel kasutada ülejäänud elementide dünaamiliseks konstrueerimiseks (mida me juba käsitlesime jaotises Manipulating Child Branches):
Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; S: WideString; ...S:='
Pärast XML-dokumendi koostamist salvestame selle meetodi Salvesta abil faili. Näiteks:
XMLDoc.Save('C:\ANDMED\NEWCD.XML');
Lisaks faili salvestamisele võimaldab salvestamismeetod salvestada XML-dokumendi uude XMLDOMDocument-objekti. Sel juhul töödeldakse dokument täielikult ja selle tulemusena kontrollitakse selle struktuuri ja süntaksit. Järgmine näitab, kuidas dokumenti mõnes teises objektis salvestada.
Protseduur TForm1.Button2Click(Saatja: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= null; lõpp;
Lõpuks võimaldab salvestamismeetod salvestada XML-dokumendi ka teistele COM-objektidele, mis toetavad liideseid IStream, IPersistStream või IPersistStreamInit.
XSL-mallide kasutamine
XMLDOMNode objekti SelectNodes meetodi käsitlemisel mainisime, et see pakub paindlikumat viisi dokumendiharudele juurdepääsuks. Paindlikkus seisneb selles, et saate harude valimise kriteeriumina määrata XSL-malli. Sellised mallid pakuvad võimsat mehhanismi teabe leidmiseks XML-dokumentidest. Näiteks kõigi meie kataloogis olevate muusika-CD-ROM-ide pealkirjade loendi saamiseks võime käivitada järgmise päringu:
Et teada saada, milliste artistide CD-d USA-s välja anti, moodustatakse päring järgmiselt:
Nodes:= Root.SelectNodes('CD/ARTIST');
Järgmine näitab, kuidas leida kataloogist esimene draiv:
Nodes:= Root.SelectNodes('CD/TITLE');
Ja viimaseks:
Nodes:= Root.SelectNodes('CD/TITLE');
Bob Dylani plaatide leidmiseks võite käivitada järgmise päringu:
Nodes:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');
ja pärast 1985. aastat välja antud plaatide loendi saamiseks käivitame järgmise päringu:
Nodes:= Root.SelectNodes('CD/TITLE');
XSL-i süntaksi üksikasjalikum arutelu nõuab eraldi postitust. Lugejate intrigeerimiseks ja edasise uurimistöö julgustamiseks toon vaid ühe väikese näite XSL-i võimalikust kasutamisest. Oletame, et peame oma kataloogi teisendama tavaliseks HTML-tabeliks. Traditsioonilisi meetodeid kasutades peame läbima kõik puu oksad ja moodustama iga saadud elemendi jaoks vastavad sildid.
XSL-i kasutades loome lihtsalt malli (või stiililehe), milles täpsustame, mida ja kuidas teisendada. Seejärel rakendame selle malli oma kataloogile – ja oletegi: meil on XSL-malli tekst, mis teisendab kataloogi tabeliks (loetelu 2).
Kood XSL-malli katmiseks meie kataloogis näeb välja järgmine:
Protseduur TForm1.Button2Click(Saatja: TObject); var XSLDoc: IXMLDOMDokument; begin XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\ANDMED\DATA.xsl'); Memo2.Tekst:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= null; lõpp;
XSL-i arutelu lõpetuseks olgu öeldud, et praegu kasutatakse seda keelt aktiivselt nii erinevate XML-dokumentide vahel teisendamiseks kui ka dokumentide vormindamiseks.
Järeldus
Arusaadavatel põhjustel on võimatu ühes artiklis katta kõiki Microsoft XML DOM-i objekte ja tuua näiteid nende kasutamise kohta. Siin oleme puudutanud ainult XML-DOM-i rakendustes kasutamise põhiprobleeme. Tabelis. Joonis 3 näitab kõiki Microsoft XML DOM-is rakendatud objekte.
ComputerPress 12"2000
Tervitan kõiki! Mitu aastat kirjutasin Matlabis ja siis oli kannatamatu Delfis programmi kirjutada.
Ma pean õppima, kuidas töötada xml-dokumentidega. Töötan RAD Stiduo XE3-s. Seal on komponent TXMLDocument, mis on ilmselt paljudele Delphi programmeerijatele teada. Tundub, et ta suudab palju. Kuid probleem on selles, et selle jaoks puudub selge dokumentatsioon ja kirjeldus. Abi RAD Studios on prügi, sest seal pole normaalset infot; vaid napp abi mõne meetodite ja protseduuride kohta lehtedel laiali (ilma näidete ja tavalise kirjelduseta). Tuhmusin kogu Interneti läbi. Foorumitest leidsin ainult konkreetsete ülesannetega teemasid, kus tuleb veel tund aega mõistatada, mida see või teine rida teeb, mis on seotud xml faili ligipääsuga.
Vajan ka juhendit peamiste funktsioonide, protseduuride ja meetodite kohta, mida xml-ga töötamisel kasutatakse. Õpik, käsiraamat, kirjeldus. Või vähemalt "xml delphis mannekeenide jaoks". Näiteks:
XML-faili avamiseks kasutage meetodit XMLDocument1.LoadFromFile("filemane.xml"), kus failinimi on faili nimi.
Loendi salvestamiseks kasutatakse IXMLNode tüüpi sõlmeloendi muutujat lapselemendid. Selle loendi määramiseks kasutage meetodit Xmldocument1.DocumentElement (kus XMLDocument1 on uuritav xml-fail).
Alamelemendi "element1" sisu päringu tegemiseks kasutage meetodit XMLDocument1.DocumentElement.ChildNodes[ "element1"].Text....
ja selles vaimus edasi kõiki rakendatud meetodeid, protseduure ja andmetüüpe.
Kust selliseid käsiraamatuid/kirjeldusi leida? Kes saab aidata?
Kui vajate konkreetset ülesannet, siis kirjeldan seda.
Mul on selline xml dokument:
mingi tekst
mingi veatekst
Muu veatekst
Programmi koodis on meil:
var
...
vanem, laps1: IXMLNode;
alustada
XMLDocument1.LoadFromFile("f:\failinimi.xml");
XMLDocument1.Active:=true;
.
.
lõpp
Mida peate tegema õppima:
(Vabandan juba ette, kui nimetan xml-dokumendi komponente valesti)
1. Hankige juurelemendi nimi (meie puhul ltm), samuti selle atribuutide (versioon, tüüp) ja nende väärtuste loend ("1.0", "seaded").
2. Hankige juure alamelementide arv. Sel juhul on neid 7: mallFailid, dimensioonid, leviala, leviala, andmed, andmed, andmed. Hankige elementide (siltide) nimed (templateFiles, mõõtmed jne). Pärast elementide arvu hankimist ja nende nimede ekstraheerimise õppimist liigun 0-lt count-1-le ja teen seda, mida vajan.
3. Hankige vajaliku elemendi atribuutide arv ja loend. Näiteks leviala elemendi jaoks. Õige vastus oleks 4 atribuuti. Esimese leviala elemendi puhul on need nimi, stiil, stseen, ath. Teise jaoks - sama, ainult atribuudi ath asemel - atribuut rz.
Pange tähele, et failis on 2 leviala elementi, millel on erinevad atribuudid. Siit saate teada, kuidas nendega töötada (kui sama nimega elemente on rohkem kui 1)?
Ma tahan nii: saan alamelementide loendi rel. juurteksti (vt punkt 2), jooksen need läbi for-ga ja leian hotspoti elemendid, mille nimeparameeter on võrdne nõutavaga (ütle "hs015_2" - kindlasti tuleb üks selline element). Kas seda probleemi saab kuidagi ilma ahelata lahendada? See tähendab, et hankida atribuudi scena väärtus hotspoti elemendi jaoks, millel on name="hs015_2"?
4. Tehke ülaltoodut sõlmede ja elementide puhul, mis on laste lapsed. Minu näites on sõlm (ja laps ja vanem.
Kui ma õigesti aru saan, peate sõlme sisu kuidagi üle kandma tüüpi muutuja IXMLNode ja tehke sama, mis lõigetes 1–3. Nii et?
5. Peate õppima, kuidas ülaltoodud parameetreid muuta (seadke ise).
Tundub, et praeguseks on see kõik. Selles etapis on minu jaoks kõige olulisemad süntaktilised konstruktsioonid.
Kellele see teema kuulub, palun kirjutage ülaltoodud küsimuste lahendamiseks teisi süntaktilisi konstruktsioone (kuidas saada atribuute, nende arv, elementide arv, nende nimed jne). Peaasi on nüüd süntaksi valdamine ja ma rakendan oma algoritmi hiljem. Suur tänu juba ette kõigile!
P.S. Ma tõesti ei tahaks oma XML-i parserit nullist kirjutada lihtsalt sellepärast, et olemasolevatele pole normaalset kirjeldust.