Bruke XML i Delphi-miljøet. Bruke XML Document Object Model

Mange Delphi-programmerere forbinder lagring av innstillinger med bruk INI filer i programmene dine. Søknad denne metoden, i mer eller mindre seriøse prosjekter, bør unngås, da det begrenser fleksibiliteten, noe som hindrer ytterligere utvidelse av programmet. Det er verdt å si at denne tilnærmingen er ganske populær på grunn av dens brukervennlighet og tilgjengeligheten av innebygde verktøy i utviklingsmiljøet.

Det ideelle alternativet for å lagre programinnstillinger er imidlertid strukturert XML filer. Deres fordel er at antall parametere kanskje ikke er faste. For bedre å forstå dette, la oss se på et spesifikt eksempel.

I USearch-programmet, når du klikker på en oppføring, vises en kontekstmeny som viser en liste over elementer. Disse elementene er kommandoer, som igjen lastes fra innstillingsfilen. Hvis innstillingene ble lagret i INI fil, så kan programmet lagre og laste et visst antall kommandoer, for eksempel 10 eller 50. Så snart en større verdi er nødvendig, må koden skrives om og kompileres deretter.


Å bruke tilnærmingen ved å bruke XML filer, vil vi kunne laste alle seksjonsparametere dynamisk. I tillegg til alt dette vil konfigurasjonsfilen bli mer elegant, uten overflødig nummerering av parametere. Imidlertid standard betyrå jobbe med XML Delphi har mange ulemper, så jeg anbefaler å bruke standardbiblioteket MSXML. Det er vanligvis inkludert som standard operativsystemer Windows-familien.


For å koble til MSXML, må vi generere en grensesnittfil med en liste over alle funksjoner ved å importere den fra COM-serveren. Det er skrevet ganske mye om hvordan man importerer et grensesnitt. detaljerte artikler, jeg foreslår at du laster ned filen MSXML2_TLB.PAS allerede klar til bruk. Etter at filen er lastet ned, plasser den ved siden av prosjektet ditt, eller slipp den inn i lib-mappen i Delphi-miljøet. Dermed vil alle opprettede programmer kunne bruke modulen MSXML, du trenger bare å legge til linjen MSXML2_TLB til bruk.

For klarhet, vurder følgende eksempel på bruk av dette biblioteket:

Prosedyre LoadData; var XMLDoc: DOMDocument;

Rot: IXMLDOMElement; begin XMLDoc:= CoDOMDocument.Create; XML XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("størrelse/bredde").Tekst); Rot:= null; XMLDoc:= null; slutt; Først opprettes en forekomst av DOMDocument-klassen, og deretter lastes innholdet av filen settings.xml inn i minnet. Siden i henhold til standarden evt filen må inneholde en root-tag (i dette tilfellet konfig.

), så må vi få den ved å bruke funksjonen DocumentElement

. Deretter sendes innholdet mellom taggene ut

, som igjen er plassert mellom taggene

. Derfor, fra settings.xml-filen, vil metoden vår vise tekst i MessageBox "100px" 500 piksler

100 piksler SelectSingleNode-metoden brukes her, som tar en streng som en parameter Til tross for at emnet arbeid med XML i Delphi har blitt diskutert ganske mye på Internett, oppstår spørsmål om dette emnet ganske ofte på forskjellige fora.

Jeg har også allerede skrevet om dette, men jeg vil gjerne komme tilbake til det virkelige tilfellet med en rask analyse

XML-fil


og datautvinning jeg gjorde på jobben i dag. Det tok meg ikke mer enn 5 minutter å få de nødvendige dataene.

Bakgrunn. I dag trengte vi å behandle data om
installerte programmer
på brukernes datamaskiner (ja, ja, vi oppdager pirater :)). Den tekniske avdelingen ga meg denne informasjonen, fratatt intetanende brukere over nettverket ved hjelp av WMI. Programmet de brukte produserer rapporter i XML-format. Følgelig brakte de meg et berg av XML-filer med en ganske kompleks struktur som jeg bare trengte å trekke ut navnet på de installerte programvareproduktene fra.
Behandling. Etter å ha sett gjennom et par filer manuelt, innså jeg at det ikke ville vare lenge og bestemte meg for å skrive en liten omformer. Etter å ha lansert Delphi, valgte jeg XML DataBinding-objektet i depotet og matet det med en av filene. Jeg forlot alle innstillingene og parameterne som standard, og som et resultat opprettet jeg en modul med et stort antall klasser og grensesnitt for å få tilgang til elementene i denne XML-filen. Jeg brukte ikke mye tid på å finne ut klassestrukturen og gikk umiddelbart videre til å skrive en omformer.

I den nye konsollapplikasjonen skrev jeg ganske enkel kode:
program XML2TXT;
bruker
Skjemaer,
Klasser, SysUtils,
SoftwareXML i "SoftwareXML.pas";
prosedyre CovertXML2Text;
var
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
hvis FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0, så
gjenta
ExportFile:= TStringList.Create;
softbase:= LoadSTDSoftware(Pchar(CurDir+sr.Name));
for i:= 0 til 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;
til FindNext(sr) 0;
slutt;

var
Application.Initialize;
CovertXML2Tekst;
slutt.

Som et resultat opprettet jeg én tekstfil for hver datamaskin i nettverket, som inneholder en liste over installert programvare.

Jeg føler at denne koden krever litt forklaring. For eksempel, hvorfor brukte jeg Forms-modulen i en konsollapplikasjon og kalte Application.Initialize-prosedyren?

Det er faktisk enkelt – det er et lite hack som lar deg bruke XML Data Binding i en konsollapplikasjon. Fordi den hardnakket nektet å initialisere klassen for å jobbe med XML. Jeg har ikke funnet ut de virkelige årsakene ennå - tiden var viktig i dag, jeg brukte allerede 4 av 5 minutter på å kjempe mot denne feilen. :) Jeg tror jeg skal finne ut av dette problemet senere og skrive hva den egentlige årsaken er.

Den merkelige softbase-klassen ble opprettet på XML-basert fil - det var navnet på rotelementet, og softbase.InstalledSoftware.source.software[i].DisplayName - naviger ganske enkelt gjennom de nestede elementene til det ønskede og få verdien.

Det er faktisk slik en av de mest ser ut raske måter arbeider med XML i Delphi.

XML brukes i økende grad til å lagre informasjon og utveksle den mellom applikasjoner og nettsteder. Mange applikasjoner bruker dette språket som basisspråk for lagring av data, mens andre bruker det til eksport og import av XML-data. Dette betyr at det er på tide for utviklere å tenke på hvordan de kan bruke XML-data i sine egne applikasjoner.

I denne artikkelen vil vi se på XML Document Object Model (DOM) og dens implementering av Microsoft - Microsoft XML DOM.

XML DOM er en objektmodell som gir utvikleren objekter for å laste og behandle XML-filer. Objektmodellen består av følgende hovedobjekter: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap og XMLDOMParseError. Hvert av disse objektene (unntatt XMLDOMParseError) inneholder egenskaper og metoder som lar deg få informasjon om objektet, manipulere objektets verdier og struktur og navigere gjennom strukturen til XML-dokumentet.

La oss se på de viktigste XML DOM-objektene og gi noen eksempler på deres bruk i Borland Delphi.

Bruker XML DOM i Borland Delphi

For å bruke Microsoft XML DOM i Delphi-applikasjoner, må du koble riktig typebibliotek til prosjektet. For å gjøre dette, utfører vi kommandoen Project | Import Type Library og i dialogboksen Import Type Library velger du Microsoft XML versjon 2.0-biblioteket (versjon 2.0), som vanligvis ligger i filen Windows\System\MSXML.DLL

Etter å ha klikket på Create Unit-knappen, vil MSXML_TLB-grensesnittmodulen bli opprettet, som vil tillate oss å bruke XML DOM-objekter: DOMDocument, XMLDocument, XMLHTTPRequest og en rekke andre implementert i MSXML.DLL-biblioteket. En referanse til MSXML_TLB-modulen må være oppført i brukslisten.

XML DOM-enhet

Dokumentobjektmodellen representerer et XML-dokument som en trestruktur bestående av grener. XML DOM-programmeringsgrensesnitt lar applikasjoner navigere i dokumenttreet og manipulere grenene. Hver gren kan ha en spesifikk type (DOMNodeType), i henhold til hvilken overordnede og underordnede grener bestemmes.

I de fleste XML-dokumenter finner du grener som element, attributt og tekst. Attributter er en spesiell type gren og er ikke barnegrener. Attributter manipuleres ved hjelp av spesielle metoder levert av XML DOM-objekter.

I tillegg til å implementere World Wide Web Consortium (W3C) anbefalte grensesnitt, inneholder Microsoft XML DOM metoder som støtter XSL, XSL Patterns, Namespaces og datatyper. For eksempel lar SelectNodes-metoden deg bruke XSL Pattern Syntax for å finne grener innenfor en spesifikk kontekst, og TransformNode-metoden støtter bruken av XSL for å utføre transformasjoner.

Test XML-dokument

Som et eksempel på et XML-dokument, la oss ta en katalog med musikk-CD-ROM, som har følgende struktur: Empire Burlesque Bob Dylan USA 10.90 1985 Columbia Bonnie Tylor Storbritannia CBS Records 9.90 1988 ... Løsne hjertet mitt Joe Cocker Bob Dylan EMI 8.20 1987

Nå er vi klare til å begynne å se på XML DOM-objektmodellen, som vi starter med XMLDOMDocument-objektet.

XML-dokument - XMLDOMDocument-objekt

Arbeid med et XML-dokument begynner med å laste det inn. For å gjøre dette bruker vi Load-metoden, som bare har én parameter som indikerer URL-en til dokumentet som skal lastes. Når du laster filer fra en lokal disk, spesifiseres kun hele filnavnet (fil:///-protokollen kan utelates i dette tilfellet). Hvis XML-dokumentet er lagret som en streng, bør du bruke LoadXML-metoden for å laste dokumentet.

For å kontrollere hvordan dokumentet lastes (synkront eller asynkront), bruk egenskapen Async. Som standard er denne egenskapen satt til True, noe som indikerer at dokumentet lastes asynkront og kontroll returneres til applikasjonen før dokumentet er fullstendig lastet. Ellers lastes dokumentet synkront, og da må du sjekke verdien til ReadyState-egenskapen for å finne ut om dokumentet er lastet inn eller ikke. Du kan også opprette en OnReadyStateChange-hendelsesbehandler som vil motta kontroll når verdien til ReadyState-egenskapen endres.

Følgende viser hvordan du laster et XML-dokument ved å bruke Load-metoden:

Bruker ... MSXML_TLB ... prosedyre TForm1.Button1Click(Sender: TObject);

var XMLDoc: IXMLDOMDocument;

begin XMLDoc:= CoDOMDocument.Create;

XMLDoc.Async:= False;

XMLDoc.Load('C:\DATA\DATA.xml');

// // Her er koden som manipulerer // XML-dokumentet og dets grener // XMLDoc:= Null;<>slutt;

Når dokumentet er lastet inn, kan vi få tilgang til egenskapene. Dermed vil NodeName-egenskapen inneholde verdien #document, NodeTypeString-egenskapen vil inneholde verdidokumentet, og URL-egenskapen vil inneholde verdien file:///C:/DATA/DATA.xml.

Som et eksempel på et XML-dokument, la oss ta en katalog med musikk-CD-ROM, som har følgende struktur: Empire Burlesque Bob Dylan USA 10.90 1985

Feilhåndtering Av spesiell interesse er egenskapene knyttet til behandlingen av dokumentet når det lastes inn. Dermed returnerer egenskapen ParseError et XMLDOMParseError-objekt som inneholder informasjon om en feil som oppsto under dokumentbehandling.</p><p> <CD> <TITLE>For å skrive en feilbehandler kan du legge til følgende kode: <ARTIST>Var XMLError: IXMLDOMParseError;</ARTIST> <COUNTRY>Bob Dylan</COUNTRY> <COMPANY>USA</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>La oss nå skrive kode som returnerer verdiene til egenskapene til XMLDOMParseError-objektet:</p><p>XMLError:= XMLDoc.ParseError;<>Hvis XMLError.ErrorCode</p><p>0 Med XMLError begynner Memo1.Lines Add('Fil: ' + URL);</p> <p>Add('Kode: ' + IntToStr(Feilkode));</p> <p>Add('Feil: ' + Årsak); <TITLE>Add('Tekst: ' + SrcText);</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Add('Linje: ' + IntToStr(Linje));</h2> <p>Add(‘Posisjon: ‘ + IntToStr(LinePos));</p><p>end Else Memo1.Lines.Add(XMLDoc.XML);</p><p>Slutt;</p> <p>og la oss kjøre applikasjonen vår. Som et resultat mottar vi følgende feilinformasjon.</p> <p>Som du kan se fra eksempelet ovenfor, er informasjonen som returneres av XMLDOMParseError-objektet ganske nok til å lokalisere feilen og forstå årsaken til dens forekomst.</p> <p>La oss nå gjenopprette det lukkende elementet</p><p>i vårt dokument og fortsette vår diskusjon om XML DOM.</p><p>Få tilgang til dokumenttreet</p> <p>For å få tilgang til et dokumenttre kan du enten hente rotelementet og deretter iterere gjennom undergrenene, eller finne en bestemt gren. I det første tilfellet får vi rotelementet gjennom DocumentElement-egenskapen, som returnerer et objekt av typen XMLDOMNode. Følgende viser hvordan du bruker DocumentElement-egenskapen for å få innholdet til hvert underordnede element:</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Var Node: IXMLDOMNode;</h2> <p>Et XMLDOMNode-objekt representerer en dokumentgren. Vi møtte allerede dette objektet da vi fikk rotelementet til dokumentet:</p><p>Root:= XMLDoc.DocumentElement;</p><p>For å få informasjon om grenen til et XML-dokument, kan du bruke egenskapene til XMLDOMNode-objektet (tabell 1).</p> <p>For å få tilgang til data som er lagret i en gren, bruker du vanligvis enten NodeValue-egenskapen (tilgjengelig for attributter, tekstgrener, kommentarer, behandlingsinstruksjoner og CDATA-seksjoner), Text-egenskapen, som returnerer tekstinnholdet til grenen, eller NodeTypedValue-egenskapen . Sistnevnte kan imidlertid bare brukes for grener med maskinskrevne elementer.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navigere i dokumenttreet</h3> <p>XMLDOMNode-objektet gir mange måter å navigere i dokumenttreet på. For å få tilgang til den overordnede grenen brukes for eksempel ParentNode-egenskapen (XMLDOMNode-type), underordnede grener får tilgang gjennom ChildNodes (XMLDOMNodeList-type), FirstChild og LastChild (XMLDOMNode-type), etc.</p> <p>Egenskapen OwnerDocument returnerer et objekt av typen XMLDOMDocument som identifiserer selve XML-dokumentet. Egenskapene som er oppført ovenfor lar deg enkelt navigere i dokumenttreet.</p><p>La oss nå gå gjennom alle grenene til XML-dokumentet:</p><p>Root:= XMLDoc.DocumentElement;</p> <p>For I:= 0 til Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I];</p><p>If Node.HasChildNodes Then GetChilds(Node,0);</p><p>Slutt;</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Som nevnt ovenfor gir XMLDOMNode-objektets SelectNodes en mer fleksibel måte å få tilgang til dokumentgrener. I tillegg er det en SelectSingleNode-metode som bare returnerer den første grenen av dokumentet. Begge disse metodene lar deg spesifisere XSL-maler for å søke etter grener.</h3> <p>La oss gå gjennom prosessen med å bruke SelectNodes-metoden for å hente alle grener som har en CD-gren og en PRICE-undergren:</p> <p>Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRIS');</p><p>Alle PRICE undergrener av CD-grenen vil bli plassert i Nodes-samlingen. Vi kommer tilbake til diskusjonen om XSL-maler litt senere.</p><p>Merk at i dette eksemplet sletter vi den første underordnede grenen.</p><p>Hvordan fjerne det første elementet i den første underordnede grenen er vist nedenfor:</p><p>Var XMLDoc: IXMLDOMDocument; <CD>…</CD> Rot: IXMLDOMNode; <TITLE>….

Node: IXMLDOMNode;

XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); <ARTIST>// Hent rotelementet Root:= XMLDoc.DocumentElement; <COUNTRY>// og den første underordnede grenen Node:= Root.FirstChild; <COMPANY>// Fjern den første underordnede grenen Node.RemoveChild(Node.FirstChild); <PRICE>I eksemplet ovenfor slettet vi ikke den første grenen <YEAR>, og det første elementet i grenen er</p><p>La oss nå legge til en ny gren. Nedenfor er koden som viser hvordan du legger til en ny musikk-CD-ROM-oppføring:</p> <ul><li>Var NewNode: IXMLDOMNode; <ul><li>Barn: IXMLDOMNode;</li> <li>... // Opprett en ny gren -</li> <li>NewNode:= XMLDoc.CreateNode(1, 'CD', '');</li> <li>// Legg til et element</li> </ul></li> <li>Child:= XMLDoc.CreateNode(1,‘TITLE’,‘’);</li> </ul><p>// Legg til et element NewNode.AppendChild(Child);</p> <h2>// Og sett verdien Child.Text:= 'Pink Floyd';</h2> <p>XMLNodeList-objektet inneholder en liste over grener som kan bygges ved hjelp av SelectNodes- eller GetElementsByTagName-metodene, eller hentes fra ChildNodes-egenskapen.</p> <p>Vi har allerede sett på bruken av dette objektet i eksemplet gitt i avsnittet "Navigere i dokumenttreet". Her presenterer vi noen teoretiske bemerkninger.</p> <p>Antall grener i listen kan fås som verdien av Length-egenskapen. Grener har indekser fra 0 til Length-1, og hver enkelt gren er tilgjengelig gjennom elementet Element array med tilhørende indeks.</p> <p>Navigering gjennom en liste over grener kan også gjøres ved å bruke NextNode-metoden, som returnerer neste gren i listen, eller Null hvis gjeldende gren er den siste.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>For å gå tilbake til begynnelsen av listen, kall tilbakestillingsmetoden.</h2> <p>Opprette og lagre dokumenter</p><p>Så langt har vi sett på hvordan du kan legge til grener og elementer til eksisterende XML-dokumenter. <CATALOG></CATALOG> La oss nå lage et XML-dokument på farten. Først av alt, la oss minne deg på at et dokument kan lastes ikke bare fra en URL, men også fra en vanlig streng. Følgende viser hvordan du oppretter et rotelement, som deretter kan brukes til å dynamisk bygge andre elementer (som vi allerede har dekket i delen Manipulering av barnegrener):</p><p>Var XMLDoc: IXMLDOMDocument;</p> <p>Rot: IXMLDOMNode;</p> <p>Node: IXMLDOMNode;</p><p>S: WideString;</p><p>... S:= '</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>';</h2> <p>Når vi diskuterte XMLDOMNode-objektets SelectNodes-metode, nevnte vi at det gir en mer fleksibel måte å få tilgang til dokumentgrener. Fleksibiliteten ligger i at du kan angi en XSL-mal som et kriterium for valg av grener. Slike maler gir en kraftig mekanisme for å søke informasjon i XML-dokumenter. For å få en liste over alle musikk-CD-ROM-titlene i katalogen vår kan du for eksempel kjøre følgende spørring:</p><p>For å finne ut hvilke artister som ble utgitt i USA, er forespørselen utformet som følger:</p><p>Nodes:= Root.SelectNodes('CD/ARTIST');</p><p>Følgende viser hvordan du finner den første stasjonen i katalogen:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>og den siste:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>For å finne Bob Dylan CD-er kan du kjøre følgende spørring:</p><p>Noder:= Root.SelectNodes(‘CD[$any$ ARTIST= ”Bob Dylan”]/TITLE’);</p><p>og for å få en liste over plater utgitt etter 1985, kjører vi følgende spørring:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>En mer detaljert diskusjon av XSL-syntaks krever et eget innlegg. For å fascinere leserne og oppmuntre til videre forskning, vil jeg gi bare ett lite eksempel på mulig bruk av XSL. La oss si at vi må konvertere katalogen vår til en vanlig HTML-tabell. Ved å bruke tradisjonelle metoder må vi gå gjennom alle grenene på treet og danne de riktige taggene for hvert element som mottas <TD>…</TD>.</p> <p>Ved å bruke XSL lager vi ganske enkelt en mal (eller stilark) der vi angir hva som må konverteres og hvordan. Så overlegger vi denne malen på katalogen vår - og vi er ferdige: vi har teksten til en XSL-mal som konverterer katalogen til en tabell (oppføring 2).</p> <p>Koden for å overlegge XSL-malen i katalogen vår ser slik ut:</p><p>Prosedyre TForm1.Button2Click(Sender: TObject);</p><p>var XSLDoc: IXMLDOMDocument;</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>begin XSLDoc:= CoDOMDocument.Create;</h2> <p>XSLDoc.Load('C:\DATA\DATA.xsl');</p> <p>Memo2.Text:= XMLDoc.TransformNode(XSLDoc);</p> <p>, som igjen er plassert mellom taggene <br></p><p>Jeg har også allerede skrevet, men jeg vil gjerne gå tilbake til det virkelige tilfellet med å raskt analysere en XML-fil og trekke ut data, som jeg gjorde i dag på jobben. Det tok meg ikke mer enn 5 minutter å få de nødvendige dataene. <br></p><p>Bakgrunn. I dag trengte vi å behandle data om installerte programmer på brukernes datamaskiner (ja, ja, vi oppdager pirater :)). Den tekniske avdelingen ga meg denne informasjonen, strippet fra intetanende brukere over nettverket som bruker WMI. Programmet de brukte produserer rapporter i XML-format. Følgelig brakte de meg et fjell av XML-filer med en ganske kompleks struktur som jeg bare trengte å trekke ut navnet på de installerte programvareproduktene fra. <br><span><br><p>Jeg har også allerede skrevet om dette, men jeg vil gjerne komme tilbake til det virkelige tilfellet med en rask analyse <br></p><p>XML-fil <br></p> <br>og datautvinning jeg gjorde på jobben i dag. Det tok meg ikke mer enn 5 minutter å få de nødvendige dataene.</p><p>Bakgrunn. I dag trengte vi å behandle data om <br>installerte programmer <br>på brukernes datamaskiner (ja, ja, vi oppdager pirater :)). Den tekniske avdelingen ga meg denne informasjonen, fratatt intetanende brukere over nettverket ved hjelp av WMI. Programmet de brukte produserer rapporter i XML-format. Følgelig brakte de meg et berg av XML-filer med en ganske kompleks struktur som jeg bare trengte å trekke ut navnet på de installerte programvareproduktene fra. <br>Behandling. Etter å ha sett gjennom et par filer manuelt, innså jeg at det ikke ville vare lenge og bestemte meg for å skrive en liten omformer. Etter å ha lansert Delphi, valgte jeg XML DataBinding-objektet i depotet og matet det med en av filene. Jeg forlot alle innstillingene og parameterne som standard, og som et resultat opprettet jeg en modul med et stort antall klasser og grensesnitt for å få tilgang til elementene i denne XML-filen. Jeg brukte ikke mye tid på å finne ut klassestrukturen og gikk umiddelbart videre til å skrive en omformer.</p><p>I den nye konsollapplikasjonen skrev jeg ganske enkel kode: <br>program XML2TXT; <br>bruker <br>Skjemaer, <br>Klasser, SysUtils, <br>SoftwareXML i "SoftwareXML.pas"; <br>prosedyre CovertXML2Text; <br>var <br>CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)); <br>hvis FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0, så <br>gjenta <br>ExportFile:= TStringList.Create; <br>softbase:= LoadSTDSoftware(Pchar(CurDir+sr.Name)); <br>for i:= 0 til softbase.InstalledSoftware.source.software.Count - 1 do <br>ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName); <br>ExportFile.Sort; <br>ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+.txt"); <br>ExportFile.Free; <br>til FindNext(sr) 0; <br>slutt;</p><p>var <br>Application.Initialize; <br>CovertXML2Tekst; <br>slutt. <br></p><p>Som et resultat opprettet jeg én tekstfil for hver datamaskin i nettverket, som inneholder en liste over installert programvare. <br></p><p>Jeg føler at denne koden krever litt forklaring. For eksempel, hvorfor brukte jeg Forms-modulen i en konsollapplikasjon og kalte Application.Initialize-prosedyren? <br></p><p>Det er faktisk enkelt – det er et lite hack som lar deg bruke XML Data Binding i en konsollapplikasjon. Fordi den hardnakket nektet å initialisere klassen for å jobbe med XML. Jeg har ikke funnet ut de virkelige årsakene ennå - tiden var viktig i dag, jeg brukte allerede 4 av 5 minutter på å kjempe mot denne feilen. :) Jeg tror jeg skal finne ut av dette problemet senere og skrive hva den egentlige årsaken er. <br></p><p>Den merkelige softbase-klassen ble opprettet basert på en XML-fil - det var navnet på rotelementet, og softbase.InstalledSoftware.source.software[i].DisplayName - naviger ganske enkelt gjennom de nestede elementene til den ønskede og få verdien. <br></p><p>Dette er faktisk hvordan en av de raskeste måtene å jobbe med XML i Delphi ser ut. <br></p> <p>Den siste tiden har det vært mye oppmerksomhet mot å bygge e-business-systemer, eller som de også kalles - B2B (business to business). Tar i betraktning anbefalingene for å bygge utvekslingsstrømmesystemer til organet som koordinerer Internett-teknologier - WWW Consortium: det legges vekt på XML-teknologier og konstruksjon av XML-dokumentutvekslingssystemer.</p> <p>Fordelen med å bruke XML i elektronisk virksomhet er den høye effektiviteten til B2B-systemer til lave kostnader ved opprettelsen på grunn av en klar og visuell presentasjon av strukturert informasjon, muligheten til å bruke moderne nettverksprotokoller og lage sanntids forretningssystemer.</p> <p>Uavhengigheten av å presentere informasjon i form av XML-dokumenter gjør at ulike selskaper som deltar i elektronisk virksomhet kan produsere programvare uavhengig av hverandre.</p> <p>I alle systemer bygges utveksling vanligvis i henhold til samme skjema, ved hjelp av HTTP-forespørsler. SSL-protokollen brukes som en informasjonssikkerhetsprotokoll (men dette er et eget emne).</p> <p>Et av de mulige alternativene for å behandle XML-meldinger er å bygge BIN/CGI (ISAPI) applikasjoner eller COM (server) komponenter som genererer eller behandler XML dokumenter.</p> <p>På den ene siden fungerer applikasjonen som en klient som sender ut en HTTP-forespørsel i POST-modus, på den andre siden er det en WEB-server på siden som forespørselen behandles og svaret sendes. XML-dokumenter brukes i informasjonsutveksling.</p> <p>Et av de mest effektive implementeringsalternativene er å bruke en eksisterende XML-parser som støtter DOM-modellen. Denne parseren er en distribusjonspakke av Win`98 eller en komponent av IE 4.7 og høyere (for Win`95) og representerer en COM-server som ligger i msxml.dll-biblioteket.</p> <p>Component Object Model (COM) - representerer innkapslede data og metoder i en enkelt enhet og en måte å få tilgang til dem gjennom et system av grensesnitt. Ved å bruke Delphi er det ganske enkelt å få tilgang til klassene til et COM-objekt (flere klasser kan inkluderes i en COM-server). Objekter er tilgjengelige ved å initialisere en forekomst av klassen gjennom et system av grensesnitt. Beskrivelsen av grensesnitt utføres av Interface Definition Language (IDL), som kan gjøres automatisk ved hjelp av miljøet.</p> <p>Delphi-verktøy importerer fra en COM-server <i>msxml.dll</i>, IDL-grensesnittbeskrivelsesfiler og en binær beskrivelsesfil av bibliotektyper - TLB - bygges. Denne operasjonen utføres gjennom systemmenyen: <b>Prosjekt | Type bibliotekimport:</b>(Figur 1). Deretter vises en dialogboks (figur 2), der du må velge et COM-objekt (i vårt tilfelle er objektet registrert under navnet "Microsoft.XMLDom (versjon 2.0)") og opprette en TLB-fil (knapp). <b>Opprett enhet</b>). Ved å bruke TLB-filen genererer miljøet en "Pascal" COM-serverbeskrivelsesfil - MSXML_TLB.pas</p> <p>MSXML_TLB.pas-filen beskriver alle grensesnitt, konstanter og co-klasser til COM-serveren.</p> <p>For å få tilgang til COM-elementobjekter er det nødvendig i direktivet <b>BRUK</b> legg til navnet på bibliotekbeskrivelsesfilen (MSXML_TLB.pas). Nedenfor er et enkelt program som bruker standard DOM-parser msxml.dll, som laster et XML-dokument og viser det i Memo1-tekstfeltelementet.</p> <b>bruker</b> Windows, meldinger, SysUtils, klasser, grafikk, kontroller, skjemaer, dialogbokser, OleServer, MSXML_TLB, StdCtrls; <b>type</b> TForm1 = <b>klasse</b>(TForm)-knapp1: TB-knapp; <b>Memo1: TMemo;</b> prosedyre <b>Button1Click(Avsender: TObject);</b> <b>slutt;</b> var <b>Form1: TForm1;</b> implementering <b>($R *.DFM)</b> Prosedyre <span>TForm1.Button1Click(Sender: Emne);</span> <b>slutt;</b>// erklæring av en koklasse for DOMDocument-objektet; <span>coDoc: CoDOMDocument;</span> <b>slutt;</b>// klasse i samsvar med IDOMDocument-grensesnittet; <b>Dokument: IXMLDOMDocument;</b> <span>begynne</span>// opprette en forekomst av et DOMDocument-objekt; <span>Doc:= coDoc.Create;</span>// kaller Load-metoden til en DOMDocument-objektforekomst; <span>Doc.load("data.xml");</span>// tilgang til xml-egenskapen til DOMDocument-objektforekomsten; <b>Memo1.Text:=Doc.xml;</b> <b>slutt;</b> <h2>slutt.</h2> <p>Hvert XML-dokument er representert som et sett med mange objekter (klasser), ved hjelp av hvilke tilgang til individuelle elementer (objektfelt) er mulig. DOM - grensesnitt beskriver tilgang til både enkle objekter av typen DOMString eller CharacterData, og til deler eller individuelle elementer av et XML-dokument: DOMFragmentElement, DOMNode, DOMElement.</p> <p>Nedenfor er de viktigste egenskapene og metodene til XMLDOMNode, XMLDOMNode, XMLDOMNodeList-objektene. Det skal bemerkes at metodene og funksjonene til DOM-objekter (Document Object Model) som presenteres nedenfor, brukes av Microsoft XML-parseren msxml.dll og er noe bredere enn DOM-modellen godkjent av W3C Consortium.</p> <p>En mer fullstendig beskrivelse av DOM-objektgrensesnittet finner du på</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2">XMLDOMDocument-objekt</td> </tr><tr><td valign="top" colspan="2">Representerer det øverste nivået i objekthierarkiet og inneholder metoder for å jobbe med et dokument: laste det, analysere det, lage elementer, attributter, kommentarer i det, etc. .</td> </tr><tr><td valign="top" colspan="2"><b>Egenskaper</b> </td> </tr><tr><td valign="top" width="39%"><b>Asynkron</b> </td> <td valign="top" width="61%">Egenskap som identifiserer gjeldende behandlingsmodus</td> </tr><tr><td valign="top" width="39%" height="19"><b>ParseError</b> </td> <td valign="top" width="61%" height="19">Returnerer en referanse til XMLDOMParseError-feilhåndteringsobjektet</td> </tr><tr><td valign="top" width="39%"><b>Aktiver - deaktiver dokumentverifisering.</b> </td> <td> </td> </tr><tr><td valign="top" width="39%"><b>url</b> </td> <td valign="top" width="61%">Returnerer URL-en til dokumentet</td> </tr><tr><td valign="top" width="39%"><b>documentElement</b> </td> <td valign="top" width="61%">Inneholder en referanse til rotelementet til dokumentet som et XMLDOMElement-objekt.</td> </tr><tr><td valign="top" colspan="2"><b>Metoder</b> </td> </tr><tr><td valign="top" width="39%"><b>last (url) <br>lastXML(xmlString)</b> </td> <td valign="top" width="61%">Laster et XML-dokument,</td> </tr><tr><td valign="top" width="39%"><b>save(objTarget)</b> </td> <td valign="top" width="61%">Lagrer et XML-dokument til en fil</td> </tr><tr><td valign="top" width="39%"><b>abort</b> </td> <td valign="top" width="61%">Avbryter lasting og behandling av dokumenter.</td> </tr><tr><td valign="top" width="39%"><b>createAttribute(name)</b> </td> <td valign="top" width="61%">Oppretter et nytt attributt med det angitte navnet for det gjeldende elementet.</td> </tr><tr><td valign="top" width="39%"><b>createNode(Type, navn, navnSpaceURI)</b> </td> <td valign="top" width="61%">Oppretter en node av den angitte typen og navnet</td> </tr><tr><td valign="top" width="39%"><b>createElement(tagName)</b> </td> <td valign="top" width="61%">Oppretter et dokumentelement med det angitte navnet.</td> </tr><tr><td valign="top" width="39%"><b>createTextNode(data)</b> </td> <td valign="top" width="61%">Oppretter tekst inne i et dokument</td> </tr><tr><td valign="top" width="39%"><b>getElementsByTagName(tagnavn)</b> </td> <td valign="top" width="61%">Returnerer en referanse til en samling dokumentelementer med gitt navn</td> </tr><tr><td valign="top" width="39%"><b>nodeFromID(idString)</b> </td> <td valign="top" width="61%">Søker etter et element etter ID</td> </tr></tbody></table><br><table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2"> <b>XMLDOMNode-objekt</b> </td> </tr><tr><td valign="top" colspan="2">Et XMLDOMNode-objekt som implementerer det grunnleggende DOM-grensesnittet <b>Node</b>, er ment for å manipulere en enkelt node i dokumenttreet. Egenskapene og metodene lar deg få og endre fullstendig informasjon om gjeldende node - dens type, navn, fullt navn, innhold, liste over underordnede elementer, etc.</td> </tr><tr><td valign="top" colspan="2"><b>Egenskaper</b> </td> </tr><tr><td valign="top" width=" "><b>nodenavn, basenavn</b> </td> <td valign="top" width="65%">Returnerer navnet på gjeldende node.</td> </tr><tr><td valign="top" width="35%"><b>prefiks</b> </td> <td valign="top" width="65%">Returnerer navneområdeprefikset.</td> </tr><tr><td valign="top" width="35%"><b>datatype</b> </td> <td valign="top" width="65%">Bestemmer innholdstypen til gjeldende node</td> </tr><tr><td valign="top" width="35%"><b>nodeType, nodeTypeString</b> </td> <td valign="top" width="65%">Returnerer typen til gjeldende node:</td> </tr><tr><td valign="top" width="35%"><b>attributter</b> </td> <td valign="top" width="65%">Returnerer en liste over attributter for gjeldende node som en samling av XMLDOMNamedNodeMap.</td> </tr><tr><td valign="top" width="35%"><b>tekst</b> </td> <td valign="top" width="65%">Returnerer innholdet i det gjeldende undertreet som tekst</td> </tr><tr><td valign="top" width="35%"><b>xml</b> </td> <td valign="top" width="65%">Returnerer en XML-representasjon av gjeldende undertre.</td> </tr><tr><td valign="top" width="35%"><b>nodeverdi</b> </td> <td valign="top" width="65%">Returnerer innholdet i gjeldende node.</td> </tr><tr><td valign="top" width="35%"><b>barnnoder</b> </td> <td valign="top" width="65%">Returnerer en liste over underordnede elementer som en XMLDOMNodeList.</td> </tr><tr><td valign="top" width="35%"><b>førstebarn, sistebarn</b> </td> <td valign="top" width="65%">Returnerer det første/siste underordnede elementet</td> </tr><tr><td valign="top" width="35%"><b>forrigeSøsken ,nesteSøsken</b> </td> <td valign="top" width="65%">Returnerer forrige/neste søskenelement.</td> </tr><tr><td valign="top" width="35%"><b>parentNode</b> </td> <td valign="top" width="65%">Inneholder en lenke til det overordnede elementet.</td> </tr><tr><td valign="top" width="35%"><b>eierDokument</b> </td> <td valign="top" width="65%">Returnerer en peker til dokumentet der den gjeldende noden er plassert.</td> </tr><tr><td valign="top" colspan="2"><b>Metoder</b> </td> </tr><tr><td valign="top" width="35%"><b>appendChild(newChild)</b> </td> <td valign="top" width="65%">Legger til et nytt underordnet element til gjeldende node.</td> </tr><tr><td valign="top" width="35%"><b>insertBefore(newChild, refChild)</b> </td> <td valign="top" width="65%">Setter inn en underordnet node, og plasserer den i det gjeldende undertreet "til venstre" for noden spesifisert av refChild-parameteren.</td> </tr><tr><td valign="top" width="35%"><b>cloneNode (dyp)</b> </td> <td valign="top" width="65%">Lag en kopi av det gjeldende elementet.</td> </tr><tr><td valign="top" width="35%"><b>getAttribute</b><b>(navn) <br> </b><b>getAttributeNode</b><b><span>(navn) <br>setAttribute(navn, verdi) <br>setAttributeNode(XMLDOMAttribute)</span> </b> </td> <td valign="top" width="65%">Tilgang til attributter (opprette, lese, skrive) til et objekt. Navn er navnet på attributtet, verdi er verdien. Returnerer verdien til et XMLDOMAttribute-objekt.</td> </tr><tr><td valign="top" width="35%"><b>replaceChild(newChild, oldChild) removeChild(oldChild)</b> </td> <td valign="top" width="65%">Erstatter oldChild-objektet i gjeldende liste over underordnede objekter med newChild. Sletter oldChild-objektet</td> </tr><tr><td valign="top" width="35%"><b>selectNodes(patternString) selectSingleNode(patternString)</b> </td> <td valign="top" width="65%">Returnerer XMLDOMNodeList-objektet valgt av søkemønsteret eller den første noden</td> </tr><tr><td valign="top" width="35%"><b>transformNode(stilark) <br>transformNodeToObject(stilark, outputObject)</b> </td> <td valign="top" width="65%">Tildeler et stilark til undertreet til gjeldende node og returnerer en streng - resultatet av behandlingen. En referanse til DOMDocument-objektet som inneholder XSL-instruksjoner sendes som en parameter.</td> </tr></tbody></table><br><h2>Bruke XML i virksomheten.</h2> <p>For et klarere bilde er det nødvendig med en forklaring på hvorfor alt dette er nødvendig for å forstå hvordan det fungerer:</p> <p>Når du bygger et B2B- eller bedrifts-ERP-system, når du organiserer informasjonsutveksling av XML-dokumenter mellom bedrifter eller filialer av et selskap, brukes et effektivt utprøvd informasjonsoverføringssystem basert på eksisterende WEB-servere via HTTP-protokoller.</p> <p>På den ene siden fungerer applikasjonen som en klient, som utsteder en HTTP-forespørsel i POST-modus, på den andre siden er det en WEB-server, på hvis side forespørselen behandles og svaret utstedes. XML-dokumenter brukes som utveksling.</p> <p>For eksempel, i et enkelt bedrifts-ERP-system, må et regnskapsprogram (ASU Bukhuchet) generere en bestemt forespørsel om å utstede en faktura og overføre den til en filial som har et lager (ASU Warehouse). AWP En lignende formulering av problemet når du oppretter et B2B-system, når Enterprise A ber om tilgjengelighet av produkter (legger inn en innkjøpsordre) fra leverandør B.</p> <p>Enterprise A og dets program fungerer som en klient. Lageret betjenes av leverandør B, som har et lagerdatabasekompleks på en SQL-server. Utvekslingen utføres gjennom bedriftens WEB-server til Leverandør B.</p> <p>Følgende typiske utvekslingsalgoritme er presentert nedenfor:</p> <br>Figur 3. <ol><li><b>Enterprise A</b> initierer <b>prosess A</b>(produktordre), som fungerer som WEB-klient.</li><li><b>Prosess A</b> genererer et XML-dokument (for eksempel en fakturaforespørsel) og overfører det som en POST http-forespørsel til WEB-serveren til leverandør B. Ressursidentifikatoren til behandlingsapplikasjonen brukes som en URI. URI-en kan være den samme for alle typer dokumenter, eller individuell for hver type. Alt avhenger av strukturen til B2B (WEB) serveren.</li><li>WEB-server analyserer forespørselen og genererer en server <b>Prosess B</b>, ved å sende teksten til XML-dokumentet som en parameter. <br>Prosess B startes av WEB-serveren og behandles enten som en ASP-side, en CGI (ISAPI)-applikasjon eller en JAVA-serverlet (serverapplikasjon)</li><li><b>Prosess B</b>- genererer en forespørsel til SQL-databasetjeneren.</li><li>SQL-serveren utfører de nødvendige operasjonene i databasen, genererer et svar og returnerer det <b>Prosess B</b>.</li><li>Basert på svaret fra SQL-serveren <b>Prosess B</b> genererer et XML-dokument (svar) og returnerer det som et svar på en http-forespørsel til klientapplikasjonen.</li><li>Deretter, avhengig av situasjonen på klientsiden, genereres enten en ny http-forespørsel eller økten avsluttes.</li> </ol><h2>Noen få ord om organiseringen av dokumentflyt.</h2> <p>Den generelle regelen for å utvikle et XML-dokumentutvekslingssystem er:</p><ul><li><b>For det første</b>- utvikling av et flytdiagram av elektroniske dokumenter og deres struktur;</li><li><b>for det andre</b>- utvikling av tabeller over prosessfunksjoner (delprosesser), dvs. hvilken funksjon i forhold til hvilket XML-dokument hver prosess skal implementere.</li> </ul><p>Hvert XML-dokument, som et HTML-dokument, må bestå av en meldingshode (informasjon omsluttet av tagger) og en meldingstekst (for en forespørsel er denne informasjonen vedlagt tagger for å svare på forespørselen). For at XML-dokumentet skal være riktig utformet, er det nødvendig å ramme de to komponentene "Header" og "Request" med tagger, for eksempel. Typen standarddokument er presentert nedenfor:</p> <p>Overskriften (Figur 4), i motsetning til et HTML-dokument, må inneholde ulike typer tjenesteinformasjon, inkludert informasjon om typen dokument som overføres og prosessen med behandlingen. Brødteksten i dokumentet går inn i informasjonsbehandling, dvs. innhold innrammet med tagger. Det skal bemerkes at strukturen av overskrifter må være den samme for alle typer dokumenter.</p> <p>For en prosess lansert av serveren, er behandlingsalgoritmen fortrinnsvis (men ikke nødvendigvis) konstruert som følger:</p> <img src='https://i0.wp.com/codenet.ru/np-includes/upload/2005/01/05/128666.jpg' height="500" width="408" loading=lazy loading=lazy><br>Figur 6. <h2>Noen grunnleggende punkter når du oppretter klientdelen</h2> <p>Som allerede forklart, når du oppretter et XML-dokument, brukes dets representasjon i form av en DOM-modell. Nedenfor er et eksempel på en del av Delphi-teksten til programmet for å lage en xml-meldingshode.</p> <b>Memo1: TMemo;</b> TThread1.HeaderCreate(Avsender: Emne); <b>slutt;</b> <span>// erklæring om en coclass, nødvendig for å opprette</span> coDoc: CoDomDocument; <span>// XMLDomDocument-objekt</span> Dok.: DomDocument; <b>Dokument: IXMLDOMDocument;</b> <span>r: IXMLDOMElement;</span> Node: IXMLDOMElement; <span>// DOMText txt: IXMLDOMText;</span>// DOMAttribute attr: IXMLDOMAttribute; <Header/>"); <span>// opprette et DOM-dokument<<b>Doc:=coDoc.Create;</b>>) </span> Doc.Set_async(false); <span>// første initiering av DOM-dokumentet <b>Doc.LoadXML("</b>" </span>// oppretter DOMElement (tag <span>Avsender<<b>Doc:=coDoc.Create;</b> Node:= Doc.createElement("Sender");</span> <span>// lag en tekstnode " <b>Doc.LoadXML("</b>" </span> LLC "Tyfon" <span>txt:= Doc.createTextNode("Typhoon LLC");<<b>Doc:=coDoc.Create;</b>// tilordning til node</span>> verdi <span> <<b>// tekst node "</b>> </span> Node.appendChild(txt); <span>// legge til et element<<b>> til roten av dokumentet som barn</b>> </span> r.appendChild(Node); <span>Fra</span> Node:= Doc.createElement("Fra"); <span>txt:= Doc.createTextNode("http://tayfun.ru/xml/default.asp");</span> Node.appendChild(txt); <span> // <TypeDocument Id="Order"/> </span> r.appendChild(Node); <b>Memo1.Text:=Doc.xml;</b> <p>// lignende operasjoner for tag</p> <p>Til</p> <img src='https://i2.wp.com/codenet.ru/np-includes/upload/2005/01/05/128662.gif' height="116" width="298" loading=lazy loading=lazy><br>Figur 5. <p><img src='https://i1.wp.com/codenet.ru/np-includes/upload/2005/01/05/128664.gif' height="179" width="385" loading=lazy loading=lazy><br>Figur 6.</p><p>Hovedfordelen med å overføre informasjon i form av XML-dokumenter er at det er mulig å generere en melding ved å bruke uavhengige tabellstrukturer i DBMS både på mottaker- og sendersiden. Ved å bruke vårt eksempel, la oss anta at vi trenger å overføre informasjon om fakturaer til Enterprise A fra et DBMS med strukturen vist i figur 6</p> <p>For å generere et xml-dokument som inneholder en faktura, bygges en SQL-spørring (spørring A) i utgangspunktet med informasjon om selve fakturaen:</p> <b>VELGE</b>* FRA Faktura_Generelt <b>HVOR</b> InvoiceNum = :num <b>VELGE</b> Varer,Kvalitet,Pris, HZ_cod <b>FRA</b> Varer <b>HVOR</b> InvoiceNum = :num <span>// :num - parameter som spesifiserer fakturanummeret.</span> <p>Nedenfor er en del av programmet som utgjør hoveddelen av xml-dokumentet:</p> <b>Memo1: TMemo;</b> TThread1.DataBodyCreate(Sender: Tobject); <b>slutt;</b> <span>// erklæring av en coclass og et XMLDomDocument-objekt</span>//coDoc: CoDomDocument ; <span>// må være global for hele modulen.</span>//Dok: DomDocument ; <span>// erklæring av DOMElement-objekter</span> r: IXMLDOMElement; <span>// DOMElement; <b>Node, Node2: IXMLDOMElement;</b> Node3, Node4: IXMLDOMElement; <b>// DOMText txt: IXMLDOMText;</b> str: String;</span> <b>Dokument: IXMLDOMDocument;</b>// Fakturanummer: <span>heltall;</span>- global variabel - // har verdien 987654 // queryA, queryB: <span>streng;</span>- global variabel, // har en verdi som tilsvarer forespørselen // queryA - request A generell informasjon om fakturaen // queryB - request B informasjon om varene beskrevet i // fakturaen (se tekst) <span>Query.Close;</span>// se teksten "spørring A" <span>Query.Text:= queryA;</span>// utfør forespørselen <span>Query.ExecSQL;</span> Query.Open; <span>// får adressen til rotelementet</span> r:=Doc.Get_documentElement; <span>Query.Text:= queryA;</span> Node2:= Doc.createElement("Request"); <span>// får adressen til rotelementet</span>// opprette DOMElement (tag) <span>Node:= Doc.createElement("Faktura");</span>// legge til et element til roten <span>r.appendChild(Node2);</span><span>// legge til et element til</span> <span>Node 2. appendChild(Node);</span> LLC "Tyfon" <span>Node3:= Doc.createElement("Depurture"); <Destination>, <DataSend>, // <DataDepurture>, <Currency> // <DestinationCompany>Node. appendChild(Node3);</span>// tilgang til "Depurture"-feltet for forespørselen <span>str:= Query.FieldByName("Depurture").AsString;</span>// lage en tekstnode = feltverdi <span>// tilordne en verdi til noden</span>// tekstnode, variabel str <span>// lignende operasjoner for tag</span>(DB-feltet "Mottaker") <span>Node:= Doc.createElement("Destinasjon");</span> <span>// lukker tilgangsforespørselen</span> Query.Close; <span>// se i teksten "forespørsel B", informasjon. Om produkter</span> Query.Text:= queryВ; <span>// tilordne parameterverdier</span> Query.Params.AsInteger:= Fakturanummer; <span>streng;</span> Query2.ExecSQL; <span>// åpner tilgang til å be om data</span> Query.Open; <span>Query.Text:= queryA;</span> Node3:= Doc.createElement("Imems"); <span>// får adressen til rotelementet</span> Node. appendChild(Node3); <span>// sløyfe gjennom alle spørringslinjer</span> <b>mens</b> <b>ikke</b> Eof.Query <b>gjøre</b> begin Node4:= Doc.createElement("Imem"); <span>// får adressen til rotelementet</span> Node3.appendChild(Node4); <span>// genererer data for taggen</span> str:= Query.FieldByName("Price").AsString; <span>txt:= Doc.createTextNode(str); <HZ_Cod>, <Quality>, <GoodName> </span> <b>Memo1.Text:=Doc.xml;</b> <b>Memo1.Text:=Doc.xml;</b> <p>Node.appendChild(txt);</p> <table width="100%"><tbody><tr><td align="middle"><br><img src='https://i1.wp.com/codenet.ru/np-includes/upload/2005/01/05/128661.gif' width="100%" loading=lazy loading=lazy></td> </tr></tbody></table><p>... <b>// lignende operasjoner for tagger</b>:</p> <b>Memo1: TMemo;</b> Som et resultat av denne prosedyren genereres følgende tekst i XML-dokumentet: <h2>For å lage en forespørsel, brukes Open-metoden for objektet</h2> <p>IXMLHttpRequest</p> <p>Open(const bstrMethod, - metodetype ="POST" bstrUrl, - URL-serveradresse varAsync, - kommunikasjonsmodus asynkron/synkron = true bstrUser, - brukernavn for autentisering bstrPassword) - passord</p> <b>Memo1: TMemo;</b> Opprette en dokumentbehandlingsserverdel <b>slutt;</b> <span>Som nevnt tidligere kan behandling av HTTP-forespørsel gjøres av enten CGI-applikasjoner eller Java-servlets. Det er også mulig å skrive ASP-sider. Men i dette tilfellet er dataoverføring bare mulig ved å bruke "GET"-metoden via en spørringsstreng. Selv om HTTP-forespørselsbehandling for ASP-sider er mer effektiv enn for en CGI-applikasjon. Men etter min mening spiller det ingen rolle hvordan man behandler, men det som er viktigere er å løse spørsmålet - hvordan bygge et behandlingsprogram, og ikke med hvilke midler.</span> Hvis vi fra forrige kapittel så på alternativer for å generere et XML-dokument, så er oppgaven til serverapplikasjonen det motsatte - å analysere XML-dokumenter. Nedenfor er en del av programmet som analyserer xml-dokumentet: <span>Tthread1.DataParser(Sender: Tobject);</span>// erklæring av DOMElement-objekter <span>r,FNode: IXMLDOMElement;</span> Str, Filnavn: String; <span>parm: String;</span> <b>// erklæring om en medklasse og</b> CoDocXML, CoDocXSL, CoDocResult: CoDomDocument ; <span>Query.Close;</span>// XMLDomDocument-objekt <span>XMLDoc, XSLDoc, ResultDoc: DomDocument ;</span>// HttpStr: String; - global variabel som inneholder HTTP-forespørselsstrengen <span>Begynne</span> XMLDoc:=coDocXML.Create; <span>XMLDoc.LoadXML(HttpStr);</span> r:=Doc.Get_documentElement; <span>// får elementets verdi</span> FNode:= r.SelectSingleNode("//TypeDocument"); <span>// får attributtverdien id="Order"</span> ResultDoc:=coDocResult.Create; <span>// innstilling av synkron behandlingsmodus</span> ResultDoc.Set_async(false); <span>// sett parsing sjekk</span> ResultDoc.validateOnParse:= sant; <span>// analyser XMLDoc ved å bruke en XSL-mal</span> XMLDoc.transformNodeToObject(XSLDoc, ResultDoc); <span>// variabel Str er tildelt en tekstverdi</span> <span>// det resulterende dokumentet.</span> Str:= ResultDoc.text; <span>// søk etter element</span> FNode:= r.SelectSingleNode("//InvoiceNumber"); <span>// og få elementets verdi</span> parm:= FNode.tekst; <span>// lukker tilgangsforespørselen</span> Query.Close; <span>Query.Text:= Str;</span>// tilordne en parameterverdi <span>streng;</span> Query.Params.AsString:= parm; <b>Memo1.Text:=Doc.xml;</b> <p>Query.ExecSQL;</p> <p>Hele høydepunktet i analysen er bruken av en XSL-mal, som genereres individuelt for hver type dokument. Resultatet av parsing er en SQL-spørringsstreng. Deretter vil kjøring av den genererte SQL-spørringsstrengen gjøre de nødvendige endringene i dataene i DBMS.</p><p> <!-- файл Order.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="//header">Fordelen med å bruke parsing gjennom en mal er at dataene er noe fleksible, og driften av algoritmen er helt uavhengig av programkoden. Nedenfor er XSL-malteksten som brukes til å behandle et ORDER-dokument: <xsl:value-of select="from" />", "<xsl:value-of select="to" />", "<xsl:value-of select="TypeDocument/@id" />") </xsl:for-each> <xsl:for-each select="//item">INSERT i TABREG (FROM, TO, TYPEDOC,body) VALUES(" <xsl:value-of select="name" />", "<xsl:value-of select="price" />", "<xsl:value-of select="quality" /> ") </xsl:for-each> </xsl:template> </xsl:stylesheet> </p><p>SETT INN i VARER (fakturanummer, navn, pris, kvalitet) VERDIER(" :antall", "</p> <p>For å forklare eksemplet ovenfor, bør det bemerkes at bruken av et par tagger er av formell karakter, fordi etter parsing må det resulterende XML-dokumentet formelt inneholde minst én node. ResultDoc.text-metoden tildeler tekstverdien til ResultDoc XML-dokumentet innhentet under parsing. I dette tilfellet er verdien alt som er innrammet av et par tagger og, dvs. SQL-spørringen vi genererte. <b>En annen funksjon ved å skrive et program bør bemerkes muligheten for å bruke en SQL-parameter</b>:nummer.</p><h2>Ved å bruke denne parameteren kan du forenkle teksten til xsl-malen. Å bestemme betydningen av de tilsvarende nodeelementene i et XML-dokument bestemmes ved først å velge navnet på den tilsvarende noden, for eksempel:</h2> <p>Kort om XSL</p> <ul><li>Forkortelsen XSL kommer fra eXtensible Stylesheet Language – et språk for formatering av stilark (XML-data). Som tittelen antyder, brukes eXtensible Stylesheet Language (XSL) til å formatere XML-data. Etter W3C-definisjon består XSL av to deler:</li><li>Formatering av elementer. Disse elementene inkluderer alle elementer i den typografiske utformingen av dataene, etter at de har blitt behandlet med XSL. Brukes kun til å generere HTML-sider.</li> </ul><p>Ved hjelp av XSLT kan vi velge dataene vi trenger fra en XML-fil og ordne dem i et skjema for presentasjon for brukeren. For eksempel, i vårt tilfelle konverterte vi XML-data til en SQL-spørring. Den klassiske bruken av XSL er som regel å formatere data i form av HTML-sider eller, mer sjelden, i form av RTF-filer.</p> <p>XSL-filen beskriver malen som XML-dataene skal konverteres etter. Når vi går tilbake til xsl-maler, kan følgende elementer (direktiver) skilles fra hverandre i XSLT:</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" width="31%"> <b>XSL-direktiver</b> </td><th align="middle" width="69%"> <b>beskrivelse</b> </th> </tr><tr><td>xsl:apply-maler</td> <td>Direktiv som indikerer bruken av de tilsvarende malene på select="malnavn"-attributtet</td> </tr><tr><td>xsl:attributt</td> <td>oppretter et attributtre og legger det til utdataelementet, parameter name="attribute name", navneområde - URI til navneområdet (navneområdeprefiks)</td> </tr><tr><td>xsl:anropsmal</td> <td>kaller malen, attributt name="URI til mal"</td> </tr><tr><td>xsl:velg <br>xsl:når <br>xsl:ellers</td> <td>gjøre et valg basert på xsl:when expr="evaluere et uttrykk i et skript", <br>language="språknavn" <br>test= "evaluert uttrykk"</td> </tr><tr><td>xsl:kommentar</td> <td>genererer en kommentar i utdatadokumentet</td> </tr><tr><td>xsl:kopi <br>xsl:kopi av</td> <td>kopierer gjeldende node til utdatakilden eller limer inn et dokumentfragment i noden der select-attributtet = "kildenodenavn"</td> </tr><tr><td>xsl:element</td> <td>oppretter et utdataelement etter navn, attributt name="elementnavn", namespace="uri navneområdereferanse"</td> </tr><tr><td>xsl:for-hver</td> <td>bruker malen på nytt på alle noder i nodelisten, select-attributtet spesifiserer listen over noder</td> </tr><tr><td>xsl:if</td> <td>sjekke betingelsen, spesifisert av testattributtet som et uttrykk</td> </tr><tr><td>xsl:inkluder</td> <td>inkluderer ekstern mal, href = "URI-referanse"-attributt</td> </tr><tr><td>xsl:utgang</td> <td>spesifiserer utdataresultatet, metodeattributtet kan ha verdiene "xml", "html" eller "tekst"</td> </tr><tr><td>xsl:param</td> <td>spesifiserer verdien av parameterne, attributtnavn="parameternavn", velg = "verdi"</td> </tr><tr><td>xsl:behandlingsinstruksjon</td> <td>oppretter en behandlingsinstruksjon, attributt name="prosessinstruksjonsnavn"</td> </tr><tr><td>xsl:sort</td> <td>sorterer flere noder, attributter select = "nodenavn", datatype = datatype ("tekst" | "nummer" | Qname), rekkefølge = sorteringsretning ("stigende" | "synkende")</td> </tr><tr><td>xsl:stilark</td> <td>definerer et xsl-maldokument, er rotelementet for XSLT</td> </tr><tr><td>xsl:mal</td> <td>definerer en xsl-mal, attributt name= "URI-prefiks til malnavnet", match= "indikasjon på noden som malen brukes på"</td> </tr><tr><td>xsl:tekst</td> <td>genererer tekst inn i utdatastrømmen, disable-output-escape-attributtet = "yes" eller "no", indikerer muligheten til å generere ESC-tegn</td> </tr><tr><td>xsl:verdi-av</td> <td>setter inn verdien til den valgte noden som tekst, select-attributtet = "peker til node" som verdien er hentet fra</td> </tr><tr><td>xsl:variabel</td> <td>spesifiserer verdien av variabelgrenser, attributtnavn = "variabelnavn", velg = "beregning av variabelverdi"</td> </tr><tr><td>xsl:with-param</td> <td>bruker en parameter på en mal, navneattributt = "parameternavn", velg = uttrykk for å evaluere gjeldende kontekst, standardverdi "."</td> </tr></tbody></table><h2>Konklusjon</h2> <p>Til slutt bør det bemerkes at bruk av en standard XML-parser <i>msxml.dll</i> er ikke det eneste verktøyet for å analysere og lage XML-dokumenter. For å lage XML-dokumenter er det for eksempel effektivt å bruke komponenter <b>TPageProduser</b> Og <b>TTableProduser</b>. Men denne artikkelen understreker bare bredden og muligheten for å bruke DOM-modellen i praksis.</p> <p>Forfatteren vil være veldig takknemlig for tilbakemeldinger om relevansen til emnet, generelt innhold, presentasjonsstil, så vel som alle andre kommentarer som vil bidra til å forbedre kvaliteten på å skrive en samling artikler og utgivelsen av en bok som dekker emnet ytterligere. av den praktiske siden ved bruk av XML-dokumenter i e-handel. Mer detaljert informasjon om den praktiske siden ved bruk av elektroniske dokumenter finnes på forfatterens nettsted www.eDocs.al.ru Det er også planlagt å legge ut kildetekster og eksempler på forfatterens nettsted.</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> <div class="evc-social-likes" data-url="https://ymol.ru/how-to-work/ispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model/" data-title="Bruke XML i Delphi-miljøet. Bruke XML Document Object Model" data-media="https://i1.wp.com/zoo-mania.ru/wp-content/uploads/2011/08/settings.ini_.jpg"> <div class="social-likes "> <div class="facebook" title="Del lenke på Facebook">Facebook</div> <div class="twitter" title="Del lenke på Twitter">Twitter</div> <div class="vkontakte" title="Del lenke på VKontakte">VKontakte</div> <div class="plusone" title="Del lenke på Google Plus">Google+</div> </div> </div> <span class="thecategory"><i class="icon-globe"></i> <a href="https://ymol.ru/no/category/how-to-work/" rel="category tag">Hvordan jobbe</a></span> </div> </article> <div class="post-tags"></div> <div class="related-posts"> <h4>Du kan også like</h4> <article id="post-36374" class="latestpost post-36374 post type-post status-publish format-standard hentry category-poleznye-sovety"> <a href="https://ymol.ru/no/operation/kak-abonentam-mts-uznat-svoi-nomer-telefona-mobilnyi/" title="Mobilt Internett fra MTS" id="featured-thumbnail"> <div class="featured-thumbnail"> <img src="/uploads/0637926dfa0061433afd588fbf5583cc.jpg" alt="Mobilt Internett fra MTS" / loading=lazy loading=lazy> </div> </a> <header class="entry-header"> <h1 class="entry-title"><a href="https://ymol.ru/no/operation/kak-abonentam-mts-uznat-svoi-nomer-telefona-mobilnyi/" rel="bookmark">Mobilt Internett fra MTS</a></h1> </header> </article> <article id="post-36373" class="latestpost post-36373 post type-post status-publish format-standard hentry category-poleznye-sovety"> <a href="https://ymol.ru/no/reviews/programma-chtoby-zapisyvat-cd-desyatka-besplatnyh-programm-dlya-zapisi/" title="Ti gratis programmer for brenning av optiske plater" id="featured-thumbnail"> <div class="featured-thumbnail"> <img src="/uploads/db92ce5b818edead87740507e0c79c7b.jpg" alt="Ti gratis programmer for brenning av optiske plater" / loading=lazy loading=lazy> </div> </a> <header class="entry-header"> <h1 class="entry-title"><a href="https://ymol.ru/no/reviews/programma-chtoby-zapisyvat-cd-desyatka-besplatnyh-programm-dlya-zapisi/" rel="bookmark">Ti gratis programmer for brenning av optiske plater</a></h1> </header> </article> <article id="post-36372" class="latestpost post-36372 post type-post status-publish format-standard hentry category-poleznye-sovety"> <a href="https://ymol.ru/no/wi-fi/prosmotr-dvd-diska-na-noutbuke-i-kompyutere-windows-ne-vidit-cd-ili-dvd-diskovod-chto/" title="Windows ser ikke CD- eller DVD-stasjonen" id="featured-thumbnail"> <div class="featured-thumbnail"> <img src="/uploads/e8ac8b5dfe614f4e051c12722bca05c1.jpg" alt="Windows ser ikke CD- eller DVD-stasjonen" / loading=lazy loading=lazy> </div> </a> <header class="entry-header"> <h1 class="entry-title"><a href="https://ymol.ru/no/wi-fi/prosmotr-dvd-diska-na-noutbuke-i-kompyutere-windows-ne-vidit-cd-ili-dvd-diskovod-chto/" rel="bookmark">Windows ser ikke CD- eller DVD-stasjonen</a></h1> </header> </article> </div> </main> <div id="sidebar" class="sidebar c-4-12" role="complementary" itemscope itemtype="http://schema.org/WPSideBar"> <aside id="recent-posts-3" class="widget widget_recent_entries"> <h3 class="widget-title">Mest populær</h3> <ul> <li class='li1'><a href='https://ymol.ru/no/instructions/red-energy-super-mts-i-posekundnyi-mts-obnovili-svoe-yaico-socialnaya/' title='MTS har oppdatert sin"яйцо" Социальная активность оператора'>MTS har oppdatert sin "egg" sosiale aktivitet til operatøren</a></li> <li class='li1'><a href='https://ymol.ru/no/reviews/vychislyaemoe-pole-v-skd-1s-8-3-yazyk-vyrazhenii-sistemy-komponovki/' title='Beregnet felt i SKD 1s 8'>Beregnet felt i SKD 1s 8</a></li> <li class='li1'><a href='https://ymol.ru/no/how-to-work/elektronnaya-pochta-kak-sredstvo-obespecheniya-delovyh-kommunikacii/' title='Elektronisk forretningskommunikasjon Kommunikasjonsverktøy er svært viktig'>Elektronisk forretningskommunikasjon Kommunikasjonsverktøy er svært viktig</a></li> <li class='li1'><a href='https://ymol.ru/no/operation/uvelichivaem-gromkost-mp3-faila-obrabotka-zapisei-s-diktofona-s-pomoshchyu/' title='Behandle opptak fra en stemmeopptaker ved hjelp av Adobe Audition Et program for å forbedre lydopptak fra en stemmeopptaker'>Behandle opptak fra en stemmeopptaker ved hjelp av Adobe Audition Et program for å forbedre lydopptak fra en stemmeopptaker</a></li> <li class='li1'><a href='https://ymol.ru/no/reviews/moskovskii-gosudarstvennyi-universitet-pechati-federalnoe-agentstvo-po/' title='Federal Agency for Education Informasjonsheuristikk'>Federal Agency for Education Informasjonsheuristikk</a></li> <li class='li1'><a href='https://ymol.ru/no/operation/ne-gruzitsya-windows-10-v-ahci-vklyuchaem-ahci-rezhim-v-bios-kak-proverit-vklyuchen-li/' title='Aktiver AHCI-modus i BIOS'>Aktiver AHCI-modus i BIOS</a></li> <li class='li1'><a href='https://ymol.ru/no/beginning/chto-takoe-klasterizaciya-semanticheskogo-yadra-i-kak-delat-gruppirovku/' title='Klynger av den semantiske kjernen og søkemotorsøk Gruppering av søk i den semantiske kjernen'>Klynger av den semantiske kjernen og søkemotorsøk Gruppering av søk i den semantiske kjernen</a></li> <li class='li1'><a href='https://ymol.ru/no/setting/kak-v-skaipe-pokazat-svoi-ekran-sobesedniku-kakie-vozmozhnosti-dostupny-v/' title='Hvilke funksjoner er tilgjengelige i Skype-samtaler?'>Hvilke funksjoner er tilgjengelige i Skype-samtaler?</a></li> <li class='li1'><a href='https://ymol.ru/no/choice/ne-zapuskaetsya-autocad-parallelnaya-konfiguraciya-nepravilna-kak/' title='Slik fikser du feilen "Appen kunne ikke starte fordi parallellkonfigurasjonen er feil"'>Slik fikser du feilen "Appen kunne ikke starte fordi parallellkonfigurasjonen er feil"</a></li> <li class='li1'><a href='https://ymol.ru/no/beginning/telekarta-odno-oborudovanie-na-neskolko-televizorov-kak-podklyuchit-dva/' title='Hvordan koble to TV-er til én parabolantenne'>Hvordan koble to TV-er til én parabolantenne</a></li> </ul> </aside> <aside id="wpforo_widget_recent_topics-2" class="widget widget_wpforo_widget_recent_topics"><div id="wpf-widget-recent-replies" class="wpforo-widget-wrap"><h3 class="widget-title">Nye meldinger</h3><div class="wpforo-widget-content"><ul> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/e71372f2d81f494ed54bb8cf89310863.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/no/wi-fi/bp-programmy-programmy-dlya-noutbuka-prostaya-programma-dlya-skachivaniya-igr/">BP-programmer. Bærbare programmer. Et enkelt program for å laste ned spill til datamaskinen</a></p> <p class="postuser">2024-05-15 03:08:19</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/3e26b340d0a794722aac41bf4af0cd69.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/no/instructions/telefon-htc-opisanie-i-harakteristiki-htc-one-m7---tehnicheskie-harakteristiki/">HTC One M7 - spesifikasjoner</a></p> <p class="postuser">2024-05-08 03:08:34</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/8e3803b8a9cee6638730e12090da84b9.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/no/choice/regulyarnye-vyrazheniya-poisk-ne-vklyuchaya-stroku-javascript-regulyarnoe/">Javascript, regulære uttrykk: eksempler, sjekke regulære uttrykk</a></p> <p class="postuser">2024-05-05 03:13:30</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/568b281d61696cb02e39bd7680ae9b3e.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/no/overview/m1-b-3-kompyuternye-tehnologii-v-nauke-i-proizvodstve-kompyuternye/">M1.B.3 Datateknologi innen vitenskap og produksjon. Datateknologi i vitenskap og utdanning Datateknologi i vitenskap og produksjon</a></p> <p class="postuser">2024-05-04 03:24:12</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/49f66e5b2f9388fa11971c779148e0b9.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/no/instructions/progress-dispetchera-zagruzok-ne-otobrazhaetsya-v-oblasti/">Hvorfor filer ikke er synlige på flash-stasjonen, og hvordan fikse det Hvorfor nedlastede filer ikke vises i nedlastinger</a></p> <p class="postuser">2024-05-02 03:11:13</p> </div> <div class="wpf-clear"></div> </div> </li> </ul></div></div></aside><aside id="categories-2" class="widget widget_categories"><h3 class="widget-title">Kategorier</h3> <ul> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/bluetooth/">Bluetooth</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/wi-fi/">WiFi</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/choice/">Valg </a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/instructions/">Instruksjoner</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/how-to-work/">Hvordan jobbe</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/setting/">Innstillinger </a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/beginning/">Start</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/overview/">Gjennomgå</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/overview/">Gjennomgå </a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/no/category/reviews/">Anmeldelser</a> </li> </ul> </aside><aside id="dwqa-latest-question-2" class="widget widget_categories"><h3 class="widget-title">Nye artikler</h3><ul> <li class="cat-item"><a href="https://ymol.ru/no/setting/nl-interneshnl-lichnyi-kabinet-vhod-nl-international-otzyvy-interesuyut/">NL International – er du interessert i anmeldelser?</a></li> <li class="cat-item"><a href="https://ymol.ru/no/setting/svetyashchiesya-linii-dlya-fotoshopa-kak-sozdat-svetyashchiesya-linii-v/">Hvordan lage glødende linjer i Photoshop - raskt og vakkert</a></li> <li class="cat-item"><a href="https://ymol.ru/no/operation/kak-abonentam-mts-uznat-svoi-nomer-telefona-mobilnyi/">Mobilt Internett fra MTS</a></li> <li class="cat-item"><a href="https://ymol.ru/no/reviews/programma-chtoby-zapisyvat-cd-desyatka-besplatnyh-programm-dlya-zapisi/">Ti gratis programmer for brenning av optiske plater</a></li> <li class="cat-item"><a href="https://ymol.ru/no/wi-fi/prosmotr-dvd-diska-na-noutbuke-i-kompyutere-windows-ne-vidit-cd-ili-dvd-diskovod-chto/">Windows ser ikke CD- eller DVD-stasjonen</a></li> <li class="cat-item"><a href="https://ymol.ru/no/instructions/red-energy-super-mts-i-posekundnyi-mts-obnovili-svoe-yaico-socialnaya/">MTS har oppdatert sin "egg" sosiale aktivitet til operatøren</a></li> <li class="cat-item"><a href="https://ymol.ru/no/reviews/vychislyaemoe-pole-v-skd-1s-8-3-yazyk-vyrazhenii-sistemy-komponovki/">Beregnet felt i SKD 1s 8</a></li> <li class="cat-item"><a href="https://ymol.ru/no/how-to-work/elektronnaya-pochta-kak-sredstvo-obespecheniya-delovyh-kommunikacii/">Elektronisk forretningskommunikasjon Kommunikasjonsverktøy er svært viktig</a></li> <li class="cat-item"><a href="https://ymol.ru/no/operation/uvelichivaem-gromkost-mp3-faila-obrabotka-zapisei-s-diktofona-s-pomoshchyu/">Behandle opptak fra en stemmeopptaker ved hjelp av Adobe Audition Et program for å forbedre lydopptak fra en stemmeopptaker</a></li> <li class="cat-item"><a href="https://ymol.ru/no/reviews/moskovskii-gosudarstvennyi-universitet-pechati-federalnoe-agentstvo-po/">Federal Agency for Education Informasjonsheuristikk</a></li> </ul></aside></div> </div> </div> </div> <footer id="colophon" class="site-footer" role="contentinfo"> <div class="site-info container"> <div class="copyrights"> <span class="sep"> </span> ymol.ru - Alt om nettbrett - Informasjonsportal</div> <a href="#blog" class="toplink" ><i class="icon-angle-up"></i></a> <nav id="navigation" class="footer-navigation" role="navigation"> <div class="menu-footer-menu-container"><ul id="menu-footer-menu" class="menu"> <li class="menu-item type-post_type object-page "><a href="https://ymol.ru/no/sitemap.xml">Områdekart</a></li> <li class="menu-item type-post_type object-page "><a href="https://ymol.ru/no/feedback/">Kontakter</a></li> </ul></div> </nav> </div> </footer> </div> <div id="vk_api_transport"></div> <script type="text/javascript"> jQuery(document).ready(function ($) { if ($('.social-likes')) { $('.social-likes').each(function () { var p = $(this).parent(); if (p.data('url')) { $(this).data({ 'url': p.data('url'), 'title': p.data('title') } ); } if ($(this).find('.pinterest').length) { if (p.data('media')) { $($(this).find('.pinterest')[0]).data({ 'media': p.data('media') } ); } else $($(this).find('.pinterest')[0]).remove(); } } ); $('.social-likes').socialLikes({ zeroes: 0 } ); } } ); </script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/akismet/_inc/form.js?ver=3.2'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/easy-vkontakte-connect/js/evc-share.js'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/easy-vkontakte-connect/js/social-likes.min.js?ver=3.0.4'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/contact-form-7/includes/js/jquery.form.min.js?ver=3.51.0-2014.06.20'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=4.5.1'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/wp-review/assets/js/main.js?ver=4.0.6'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/themes/sociallyviral/js/customscripts.js?ver=20120212'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js?ver=4.6.9'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=4.6.9'></script> <script>setTimeout( function(){ jQuery.post('/wp-content/plugins/kama-postviews/ajax-request.php',{ meta_id:'1438', view_type:'post_view', relpath:'' } ,function(result){ jQuery('.ajax_views').html(result); } );} , 2000);</script> <script>function lc_get_cookie(name) { var c = document.cookie;if (c.indexOf(name) != -1) { var x = c.indexOf(name)+name.length+1;var y = c.indexOf(";",x);if (y < 0) y = c.length;return decodeURIComponent(c.substring(x,y));} else return "";} if ((d = document.getElementById("commentform")) != null) { e = d.elements;var z = lc_get_cookie("comment_author_email_27b5a291828a105bf783f92a6d070718");if (z != "") e["email"].value = z;z = lc_get_cookie("comment_author_27b5a291828a105bf783f92a6d070718");if (z != "") e["author"].value = z.replace(/\+/g, " ");z = lc_get_cookie("comment_author_url_27b5a291828a105bf783f92a6d070718");if (z != "") e["url"].value = z;} </script></body></html>