Delphi'de XML belgeleriyle nasıl çalışılır? Özellikle TXMLDocument ile mi? XML Belge Nesne Modelini Kullanma.

Birçok Delphi programcısı için, ayarların kaydedilmesi, INI programlarındaki dosyalar. Bu yöntemin az çok ciddi projelerde kullanılması, programın daha fazla genişletilmesini önleyen esnekliği sınırladığı için kaçınılmalıdır. Bu yaklaşımın, kullanım kolaylığı ve geliştirme ortamında yerleşik araçların bulunması nedeniyle oldukça popüler olduğu söylenmelidir.

Ancak yapılandırılmış XML Dosyalar. Avantajları, parametre sayısının sabitlenemeyebilmesidir. Bunu daha iyi anlamak için belirli bir örnek düşünün.

USearch programında, bir girdiye tıkladığınızda, bir öğe listesinin görüntülendiği bir bağlam menüsü belirir. Bu öğeler, sırayla ayarlar dosyasından yüklenen komutlardır. Ayarların saklanmış olması durumunda INI dosya, daha sonra program belirli sayıda komutu kaydedebilir ve yükleyebilir, örneğin 10 veya 50. Daha büyük bir değer gerektiğinde, kodu yeniden yazmanız ve buna göre yeniden derlemeniz gerekecektir.


kullanarak bir yaklaşım uygulamak XML dosyaları, tüm bölüm parametrelerini dinamik olarak yükleyebileceğiz. Ek olarak, konfigürasyon dosyası gereksiz parametre numaralandırması olmadan daha şık hale gelecektir. Fakat, standart araçlar birlikte çalışmak XML Delphi'nin birçok dezavantajı var, bu yüzden kullanmanızı tavsiye ederim standart kitaplık MSXML... Genellikle varsayılan olarak dahil edilir işletim sistemleri Windows ailesi.


Bağlanmak MSXML, COM sunucusundan içe aktararak tüm işlevlerin bir listesini içeren bir arayüz dosyası oluşturmamız gerekiyor. Arayüzün nasıl içe aktarılacağı konusunda birçok detaylı yazı yazılmış ama dosyayı indirmenizi öneririm. MSXML2_TLB.PAS kullanıma hazır. Dosya indirildikten sonra projenizin yanına yerleştirin veya Delphi ortamının lib klasörüne bırakın. Böylece oluşturulan tüm programlar modülü kullanabilecektir. MSXML, sadece MSXML2_TLB satırını kullanımlara eklemeniz gerekir.

Netlik için, bu kitaplığı kullanmanın aşağıdaki örneğini göz önünde bulundurun:

Prosedür LoadData; var XMLDoc: DOMDocument; Kök: IXMLDOMElement; XMLDoc'u başlat: = CoDOMDocument.Create; XMLDoc.Load ("settings.xml"); Kök: = XMLDoc.DocumentElement; ShowMessage (Root.SelectSingleNode ("boyut / genişlik"). Metin); Kök: = sıfır; XMLDoc: = sıfır; son;

Önce DOMDocument sınıfının bir örneği oluşturulur ve ardından settings.xml dosyasının içeriği belleğe yüklenir. Standarda göre, herhangi bir XML dosya kök etiketi içermelidir (içinde bu durumda yapılandırma), o zaman işlevi kullanarak almamız gerekiyor Belge Öğesi... Ardından içerik, etiketler arasında görüntülenir. , sırayla etiketler arasında ... Böylece settings.xml dosyasından, yöntemimiz metni MessageBox'ta görüntüleyecektir. "100 piksel".

500 piksel 100 piksel

Burada parametre olarak bir dize alan SelectSingleNode yöntemi uygulanır.

Delphi'de XML ile çalışma konusunun internette geniş çapta tartışılmasına rağmen, bu konuyla ilgili sorular genellikle her türlü forumda ortaya çıkmaktadır.

Bunu da yazdım, ancak bugün işte yaptığım bir XML dosyasını hızlı bir şekilde ayrıştırma ve verileri çıkarma konusunda gerçek hayattaki duruma dönmek istiyorum. Gerekli verileri almam 5 dakikadan fazla sürmedi.

Arka plan. Bugün hakkında verileri işlemem gerekiyordu yüklü programlar kullanıcıların bilgisayarlarında (evet, evet, korsanları tespit ediyoruz :)). Teknik departman, WMI kullanan bir ağ üzerinden şüphelenmeyen kullanıcılardan alınan bu bilgileri bana sağladı. Kullandıkları program içinde raporlar üretir. XML biçimi... Buna göre, bana sadece kurulu yazılım ürünlerinin adını çıkarmam gereken oldukça karmaşık bir yapıya sahip bir XML dosyası yığını getirdiler.

Tedavi . Elimle bir iki dosyaya baktıktan sonra yaşlanmanın uzun sürmeyeceğini fark ettim ve küçük bir dönüştürücü yazmaya karar verdim. Delphi'yi başlattıktan sonra, depodan XML DataBinding nesnesini seçtim ve dosyalardan birini besledim. Tüm ayarları ve parametreleri varsayılan olarak bıraktım ve sonuç olarak bir modül büyük miktar Bu XML dosyasının öğelerine erişmek için sınıflar ve arabirimler. Uzun süre sınıfların yapısıyla uğraşmadım, hemen dönüştürücü yazmaya geçtim.

Yeni bir konsol uygulamasında oldukça basit bir kod yazdım:


XML2TXT programı;

kullanır
Formlar,
Sınıflar, SysUtils,
"SoftwareXML.pas" içindeki SoftwareXML;

prosedür CovertXML2Text;
var
yazılım tabanı: IXMLSTDSoftwareType;
ben: tam sayı;
kaynak: TSearchRec;
CurDir: dize;
Dışa Aktarma Dosyası: TStringList;
başlamak
CurDir: = IncludeTrailingPathDelimiter (ExtractFilePath (Application.ExeName));
FindFirst (CurDir + "*. xml", faAnyFile, sr) = 0 ise
tekrarlamak
ExportFile: = TStringList.Create;
softbase: = LoadSTDSoftware (Pchar (CurDir + sr.Name));
i için: = 0 - 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;
FindNext (sr) 0'a kadar;
son;

başlamak
Application.Initialize;
CovertXML2Text;
son.

Sonuç olarak, ızgaradaki her bilgisayar için kurulu yazılımların bir listesini içeren bir metin düzenleyicim oldu.

Bu kodun biraz açıklama gerektireceğini hissediyorum. Örneğin, neden bir konsol uygulamasında Forms modülünü kullandım ve Application.Initialize; prosedürünü çağırdım?

Aslında basit - bu, bir konsol uygulamasında XML Veri Bağlama kullanmanıza izin veren küçük bir hack. Çünkü XML ile çalışmak için sınıfı başlatmayı inatla reddetti. Henüz gerçek nedenleri çözemedim - bugün zaman önemliydi, bu hatayla savaşmak için 5 dakikadan 4'ünü harcadım. :) Bu sorunu daha sonra halletmeyi ve asıl sebebinin ne olduğunu yazmayı düşünüyorum.

Garip softbase sınıfı bir XML dosyasından oluşturuldu - bu, kök öğenin adı ve softbase.InstalledSoftware.source.software [i] .DisplayName, yalnızca iç içe öğeler arasında istenen öğeye gitmek ve değerini almaktır.

Bu nasıl en çok biri hızlı yollar Delphi'de XML ile çalışmak.

XML, bilgileri depolamak ve uygulamalar ile Web siteleri arasında değiş tokuş etmek için giderek daha fazla kullanılmaktadır. Birçok uygulama bu dili veri depolamak için temel dil olarak kullanırken, diğerleri XML verilerini dışa ve içe aktarmak için kullanır. Bu nedenle, geliştiricilerin XML verilerinin kendi uygulamalarında nasıl kullanılabileceğini düşünmeye başlamalarının zamanı geldi.

Bu makalede, XML Belge Nesne Modeli'ne (DOM) ve Microsoft'un XML DOM uygulamasına bakacağız.

XML DOM, bir geliştiriciye XML dosyalarını yüklemek ve işlemek için nesneler sağlayan bir nesne modelidir. Nesne modeli şu temel nesnelerden oluşur: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap ve XMLDOMParseError. Bu nesnelerin her biri (XMLDOMParseError hariç), nesne hakkında bilgi almanıza, nesnenin değerlerini ve yapısını değiştirmenize ve bir XML belgesinin yapısında gezinmenize izin veren özellikler ve yöntemler içerir.

Ana XML DOM nesnelerine bakalım ve Borland Delphi'deki kullanımlarına ilişkin bazı örnekler gösterelim.

Borland Delphi'de XML DOM Kullanımı

Delphi uygulamalarında Microsoft XML DOM kullanmak için projeye uygun tip kütüphanesini bağlamanız gerekmektedir. Bunu yapmak için Project | komutunu çalıştırıyoruz. Tip Kitaplığını Al ve Tip Kitaplığını Al iletişim kutusunda, genellikle Windows \ System \ MSXML.DLL dosyasında bulunan Microsoft XML sürüm 2.0 (Sürüm 2.0) kitaplığını seçin.

Birim Oluştur düğmesine tıkladıktan sonra, XML DOM nesnelerini kullanmamıza izin verecek olan MSXML_TLB arabirim modülü oluşturulacaktır: DOMDocument, XMLDocument, XMLHTTPRequest ve MSXML.DLL kitaplığında uygulanan diğerleri. MSXML_TLB modülüne yapılan başvuru Kullanımlar listesinde olmalıdır.

XML DOM cihazı

Belge Nesne Modeli, dallardan oluşan bir ağaç yapısında bir XML belgesini temsil eder. XML DOM API'leri, uygulamaların belge ağacında gezinmesine ve dallarını değiştirmesine olanak tanır. Her dal, üst ve alt dalların belirlendiği belirli bir türe (DOMNodeType) sahip olabilir. Çoğu XML belgesi, tür öğesi, nitelik ve metin dalları içerir. Nitelikler özel bir dal türüdür ve alt dallar değildir. Nitelikleri yönetmek için şunu kullanın: özel yöntemler XML DOM nesneleri tarafından sağlanır.

Microsoft XML DOM, World Wide Web Consortium (W3C) tarafından önerilen arabirimleri uygulamaya ek olarak, XSL, XSL Modelleri, Ad Alanları ve veri türlerini destekleyen yöntemler içerir. Örneğin, SelectNodes yöntemi, belirli bir bağlamda dalları bulmak için XSL Model Sözdizimini kullanmanıza olanak tanır ve TransformNode yöntemi, dönüşümleri gerçekleştirmek için XSL kullanımını destekler.

XML Belgesini Test Et

Örnek bir XML belgesi olarak, aşağıdaki yapıya sahip bir müzik CD-ROM dizinini ele alalım:

imparatorluk burlesk Bob Dylan Amerika Birleşik Devletleri Kolombiya 10.90 1985 kalbini sakla bonnie tylor Birleşik Krallık CBS Kayıtları 9.90 1988 ... Kalbimi özgür bırak Joe cocker Amerika Birleşik Devletleri EMI 8.20 1987

Artık XMLDOMDocument nesnesinden başlayarak XML DOM nesne modeline bakmaya hazırız.

XML Belgesi - XMLDOMDocument Nesnesi

Bir XML belgesiyle çalışmak, onu yüklemekle başlar. Bunu yapmak için, yüklenen belgenin URL'sini belirten yalnızca bir parametreye sahip olan Load yöntemini kullanıyoruz. Dosyaları yerel bir diskten yüklerken, yalnızca tam dosya adı belirtilir (bu durumda dosya: /// protokolü atlanabilir). XML belgesi bir dize olarak saklanıyorsa, belgeyi yüklemek için LoadXML yöntemini kullanın.

Async özelliği, belgenin nasıl yüklendiğini (eşzamanlı veya eşzamansız) kontrol etmek için kullanılır. Varsayılan olarak, bu özellik, belgenin eşzamansız olarak yüklendiğini ve belge tamamen yüklenmeden önce kontrolün uygulamaya döndürüldüğünü belirten True olarak ayarlanır. Aksi takdirde, belge eşzamanlı olarak yüklenir ve ardından belgenin yüklenip yüklenmediğini öğrenmek için ReadyState özelliğinin değerini kontrol etmeniz gerekir. Ayrıca ReadyState özelliğinin değeri değiştiğinde denetimi devralacak OnReadyStateChange olayı için bir işleyici oluşturabilirsiniz.

Aşağıdakiler, Load yöntemi kullanılarak bir XML belgesinin nasıl yükleneceğini gösterir:

Kullanır ... MSXML_TLB ... prosedürü TForm1.Button1Click (Gönderen: TObject); var XMLDoc: IXMLDOMDocument; XMLDoc'u başlat: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // // XML belgesini ve dallarını yöneten kodun // XMLDoc: = Nil; son;

Belge yüklendikten sonra özelliklerine erişebiliriz. Böylece, NodeName özelliği #document değerini içerecek, NodeTypeString özelliği belge değerini içerecek ve URL özelliği şu dosyayı içerecek: /// C: /DATA/DATA.xml değeri.

Hata yönetimi

Özellikle ilgi çekici olan, yükleme üzerine belge işleme ile ilgili özelliklerdir. Örneğin, ParseError özelliği, belge işlenirken oluşan bir hata hakkında bilgi içeren bir XMLDOMParseError nesnesi döndürür.

Bir hata işleyicisi yazmak için aşağıdaki kodu ekleyebilirsiniz:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load ('C: \ DATA \ DATA.xml'); XMLError: = XMLDoc.ParseError; Eğer XMLError.ErrorCode<>0 Sonra // // Hatayı burada ele alıyoruz // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Sıfır;

Bir hata durumunda hangi bilgilerin döndürüldüğünü öğrenmek için aşağıdaki dizin girişini değiştirin:

imparatorluk burlesk Bob Dylan Amerika Birleşik Devletleri Kolombiya 10.90 1985

kapatma elemanının çıkarılması ikinci satırda:</p><p> <CD> <TITLE>imparatorluk burlesk <ARTIST>Bob Dylan</ARTIST> <COUNTRY>Amerika Birleşik Devletleri</COUNTRY> <COMPANY>Kolombiya</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Şimdi XMLDOMParseError nesnesinin özellik değerlerini döndüren bir kod yazalım:</p><p>XMLError: = XMLDoc.ParseError; Eğer XMLError.ErrorCode<>0 Sonra XMLError ile, Memo1.Lines Ekle'ye başlar ('Dosya:' + URL); Ekle ('Kod:' + IntToStr (HataKodu)); Ekle ('Hata:' + Sebep); Ekle ('Metin:' + Kaynak Metin); Ekle ('Satır:' + IntToStr (Satır)); Ekle ('Konum:' + IntToStr (LinePos)); Else Memo1.Lines.Add'i sonlandırın (XMLDoc.XML); Son;</p><p>ve uygulamamızı çalıştırın. Sonuç olarak, hata hakkında aşağıdaki bilgileri alıyoruz.</p> <p>Yukarıdaki örnekten de görebileceğiniz gibi, XMLDOMParseError nesnesi tarafından döndürülen bilgiler, hatayı yerelleştirmek ve oluşma nedenini anlamak için oldukça yeterlidir.</p> <p>Şimdi kapatma elemanını geri yükleyeceğiz <TITLE>belgemizde ve XML DOM tartışmamıza devam edin.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Belge ağacına erişme</h2> <p>Belge ağacına erişmek için ya kök öğeyi alabilir ve ardından alt dalları üzerinde yineleyebilir ya da belirli bir dalı bulabilirsiniz. İlk durumda, XMLDOMNode türünde bir nesne döndüren DocumentElement özelliği aracılığıyla kök öğeyi alırız. Her bir alt öğenin içeriğini almak için DocumentElement özelliğini nasıl kullanacağınız aşağıda açıklanmıştır:</p><p>Var Düğüm: IXMLDOMNode; Kök: IXMLDOMElement; Ben: Tamsayı; ... Kök: = XMLDoc.DocumentElement; I için: = 0 - Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Düğüm.Metin); Son;</p><p>XML belgemiz için aşağıdaki metni alıyoruz.</p> <p>Belirli bir dalla veya ilk alt dalın altındaki bir dalla ilgileniyorsak, XMLDOMDocument nesnesinin NodeFromID yöntemini veya GetElementByTagName yöntemini kullanabiliriz.</p> <p>NodeFromID yöntemi, XML Şemasında veya Belge Türü Tanımında (DTD) tanımlandığı gibi benzersiz bir tanımlayıcı gerektirir ve bu tanımlayıcıyla bir dal döndürür.</p> <p>GetElementByTagName yöntemi, belirli bir öğeye (etiket) sahip bir dize gerektirir ve bu öğeye sahip tüm dalları döndürür. CD-ROM dizinimizde tüm sanatçıları bulmak için bu yöntemi nasıl kullanacağınız aşağıda açıklanmıştır:</p><p>Düğümler: IXMLDOMNodeList; Düğüm: IXMLDOMNode; ... Düğümler: = XMLDoc.GetElementsByTagName ('ARTIST'); I için: = 0 - Nodes.Length-1 do Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Düğüm.Metin); Son;</p><p>XML belgemiz için aşağıdaki metni alacağız</p> <p>XMLDOMNode nesnesinin SelectNodes yönteminin belge dallarına erişmek için daha esnek bir yol sağladığını unutmayın. Ama daha fazlası aşağıda.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Belge Dalı - XMLDOMNode Nesnesi</h2> <p>XMLDOMNode nesnesi bir belge dalını temsil eder. Belgenin kök öğesini aldığımızda bu nesneyle zaten karşılaştık:</p><p>Kök: = XMLDoc.DocumentElement;</p><p>Bir XML belgesinin bir dalı hakkında bilgi almak için XMLDOMNode nesnesinin özelliklerini kullanabilirsiniz (Tablo 1).</p> <p>Bir dalda depolanan verilere erişmek için, yaygın olarak ya NodeValue özelliği (öznitelikler, metin dalları, yorumlar, işleme talimatları ve CDATA bölümleri için kullanılabilir) ya da dalın metin içeriğini döndüren Text özelliği kullanılır. veya NodeTypedValue özelliği. Ancak ikincisi, yalnızca yazılan öğelere sahip dallar için kullanılabilir.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Belge ağacında gezinme</h3> <p>XMLDOMNode nesnesi, belge ağacında gezinmek için birçok yol sağlar. Örneğin, üst dala erişmek için ParentNode özelliğini (tür XMLDOMNode) kullanın, alt dallara ChildNodes özellikleri (tür XMLDOMNodeList), FirstChild ve LastChild (XMLDOMNode türü) vb. aracılığıyla erişin. OwnerDocument özelliği, XML belgesinin kendisini tanımlayan bir XMLDOMDocument nesnesi döndürür. Yukarıda listelenen özellikler, belge ağacında gezinmeyi kolaylaştırır.</p> <p>Şimdi XML belgesinin tüm dalları arasında dolaşalım:</p><p>Kök: = XMLDoc.DocumentElement; I için: = 0 - Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Node.HasChildNodes ise GetChilds (Node, 0); Son;</p><p>Yukarıda belirtildiği gibi, XMLDOMNode nesnesinin SelectNodes'u, belge dallarına erişmek için daha esnek bir yol sağlar. Ayrıca, belgenin yalnızca ilk dalını döndüren bir SelectSingleNode yöntemi vardır. Bu yöntemlerin her ikisi de şube aramaları için XSL şablonları tanımlamanıza olanak tanır.</p> <p>Bir CD dalı ve bir PRICE alt dalı olan tüm dalları getirmek için SelectNodes yöntemini kullanma sürecine bakalım:</p><p>Kök: = XMLDoc.DocumentElement; Düğümler: = Root.SelectNodes ('CD / FİYAT');</p><p>CD şubesinin tüm PRICE alt dalları Nodes koleksiyonuna yerleştirilecektir. XSL şablonlarını tartışmaya biraz sonra döneceğiz.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Alt dalları manipüle etme</h3> <p>Alt dalları işlemek için XMLDOMNode nesnesinin yöntemlerini kullanabiliriz (Tablo 2).</p> <p>İlk diskle ilgili kaydı tamamen silmek için aşağıdaki kodu çalıştırmanız gerekir:</p><p>Var XMLDoc: IXMLDOMDocument; Kök: IXMLDOMNode; Düğüm: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // Kök elemanı al Root: = XMLDoc.DocumentElement; Düğüm: = Kök; // İlk alt dal Node.RemoveChild'i (Node.FirstChild) kaldırın;</p><p>Bu örnekte ilk alt dalı sildiğimizi unutmayın. İlk alt dalın ilk öğesinin nasıl kaldırılacağı aşağıda gösterilmiştir:</p><p>Var XMLDoc: IXMLDOMDocument; Kök: IXMLDOMNode; Düğüm: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // Kök elemanı al Root: = XMLDoc.DocumentElement; // ve ilk alt dal Node: = Root.FirstChild; // İlk alt dal Node.RemoveChild'i (Node.FirstChild) kaldırın;</p><p>Yukarıdaki örnekte ilk dalı değil sildik <CD>…</CD> ve dalın ilk elemanı <TITLE>….

Şimdi yeni bir dal ekleyelim. Yeni bir müzik CD-ROM girişinin nasıl ekleneceğini gösteren kod aşağıdadır:

Var NewNode: IXMLDOMNode; Alt: IXMLDOMNode; ... // Yeni bir dal oluştur - NewNode: = XMLDoc.CreateNode (1, 'CD', ''); // Bir eleman ekle Alt: = XMLDoc.CreateNode (1, 'TITLE', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini ayarlayın Child.Text: = 'Pink Floyd'; // Bir eleman ekle <ARTIST>Alt: = XMLDoc.CreateNode (1, 'ARTIST', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini ayarlayın Child.Text: = 'Division Bell'; // Bir eleman ekle <COUNTRY>Alt: = XMLDoc.CreateNode (1, 'ÜLKE', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini Child.Text: = 'UK'; // Bir eleman ekle <COMPANY>Alt: = XMLDoc.CreateNode (1, 'ŞİRKET', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini Child.Text: = 'EMI Records Ltd.'; // Bir eleman ekle <PRICE>Alt: = XMLDoc.CreateNode (1, 'PRICE', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini ayarlayın Child.Text: = '11 .99 "; // Bir eleman ekleyin <YEAR>Alt: = XMLDoc.CreateNode (1, 'YIL', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini Child.Text: = '1994'; // Ve bir Root.AppendChild (NewNode) şubesi ekleyin; ...</p><p>Yukarıdaki kod, yeni bir dal eklemek için aşağıdaki adım sırasını gösterir:</p> <ul><li>CreateNode yöntemini kullanarak yeni bir dal oluşturma: <ul><li>CreateNode yöntemini kullanarak bir öğe oluşturma;</li> <li>AppendChild yöntemini kullanarak bir şubeye eleman ekleme;</li> <li>Text özelliği aracılığıyla bir öğenin değerini ayarlama;</li> <li>… Tüm öğeler için tekrarlayın.</li> </ul></li> <li>AppendChild yöntemini kullanarak belgeye yeni bir dal ekleme.</li> </ul><p>AppendChild yönteminin ağacın sonuna bir dal eklediğini hatırlayın. Ağaçta belirli bir yere dal eklemek için InsertBefore yöntemini kullanmanız gerekir.</p> <h2>Dal kümesi - XMLDOMNodeList nesnesi</h2> <p>XMLNodeList nesnesi, SelectNodes veya GetElementsByTagName yöntemleri kullanılarak oluşturulabilen ve ayrıca ChildNodes özelliğinden elde edilen dalların bir listesini içerir.</p> <p>Bu nesnenin kullanımını "Belge ağacında gezinme" bölümünde sağlanan örnekte zaten tartışmıştık. Burada bazı teorik yorumlar yapacağız.</p> <p>Listedeki dal sayısı, Length özelliğinin değeri olarak alınabilir. Dallar 0'dan Uzunluk-1'e kadar indekslenir ve her bir dal, Item dizisindeki ilgili indekslenmiş öğe aracılığıyla erişilebilir.</p> <p>Dallar listesinde gezinme, listedeki bir sonraki dalı döndüren NextNode yöntemi veya geçerli dal son ise Nil kullanılarak da yapılabilir. Listenin başına dönmek için Sıfırlama yöntemini çağırın.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Belgeler oluşturun ve kaydedin</h2> <p>Bu nedenle, mevcut XML belgelerine nasıl dallar ve öğeler ekleyebileceğinizi ele aldık. Şimdi anında bir XML belgesi oluşturalım. Her şeyden önce, bir belgenin yalnızca bir URL'den değil, aynı zamanda normal bir dizeden de yüklenebileceğini unutmayın. Daha sonra öğelerin geri kalanını dinamik olarak oluşturmak için kullanılabilecek bir kök öğenin nasıl oluşturulacağı aşağıda açıklanmıştır (daha önce Alt Dalları Manipüle Etme bölümünde ele almıştık):</p><p>Var XMLDoc: IXMLDOMDocument; Kök: IXMLDOMNode; Düğüm: IXMLDOMNode; S: Geniş Dize; ... S: = ' <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.LoadXML (S); Kök: = XMLDoc.DocumentElement; Düğüm: = XMLDoc.CreateNode (1, 'CD', ''); Root.AppendChild (Düğüm); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Sıfır;</p><p>XML belgesini oluşturduktan sonra Kaydet yöntemini kullanarak bir dosyaya kaydedin. Örneğin:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML');</p> <p>Kaydet yöntemi, bir dosyaya kaydetmeye ek olarak, bir XML belgesini yeni bir XMLDOMDocument nesnesine kaydetmenize olanak tanır. Bu durumda, belge tamamen işlenir ve sonuç olarak yapısı ve sözdizimi kontrol edilir. Bir belgeyi başka bir nesneye nasıl kaydedeceğiniz aşağıda açıklanmıştır:</p><p>Prosedür TForm1.Button2Click (Gönderen: TObject); var XMLDoc2: IXMLDOMDocument; XMLDoc2'yi başlat: = CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: = Sıfır; son;</p><p>Sonuç olarak, Kaydet yöntemi, XML belgesini IStream, IPersistStream veya IPersistStreamInit arabirimlerini destekleyen diğer COM nesnelerine kaydetmenize de olanak tanır.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XSL Şablonlarını Kullanma</h2> <p>XMLDOMNode nesnesinin SelectNodes yöntemini tartışırken, belge dallarına erişmek için daha esnek bir yol sağladığından bahsetmiştik. Esneklik, dalları seçme kriteri olarak bir XSL şablonu belirtebilmenizdir. Bu tür şablonlar, XML belgelerinde bilgi bulmak için güçlü bir mekanizma sağlar. Örneğin, dizinimizde bulunan tüm müzik CD-ROM başlıklarının bir listesini almak için aşağıdaki sorguyu çalıştırabilirsiniz:</p><p>ABD'de hangi sanatçıların disklerinin yayınlandığını öğrenmek için talep şu şekilde oluşturulur:</p><p>Düğümler: = Root.SelectNodes ('CD / SANATÇI');</p><p>Bir dizindeki ilk sürücüyü nasıl bulacağınız aşağıda açıklanmıştır:</p><p>Düğümler: = Root.SelectNodes ('CD / TITLE');</p><p>Ve son olarak:</p><p>Düğümler: = Root.SelectNodes ('CD / TITLE');</p><p>Bob Dylan'ın disklerini bulmak için aşağıdaki sorguyu çalıştırabilirsiniz:</p><p>Düğümler: = Root.SelectNodes ('CD [$ herhangi bir $ SANATÇI =" Bob Dylan "] / BAŞLIK');</p><p>ve 1985'ten sonra yapılan disklerin bir listesini almak için aşağıdaki sorguyu çalıştırıyoruz:</p><p>Düğümler: = Root.SelectNodes ('CD / TITLE');</p><p>XSL sözdiziminin daha ayrıntılı bir tartışması ayrı bir yayın gerektirir. Okuyucuların ilgisini çekmek ve daha fazla araştırmayı teşvik etmek için, XSL'nin olası kullanımına dair sadece küçük bir örnek vereceğim. Diyelim ki kataloğumuzu normal bir HTML tablosuna dönüştürmemiz gerekiyor. Geleneksel yöntemleri kullanarak, ağacın tüm dallarını yinelemeliyiz ve alınan her eleman için karşılık gelen etiketleri oluşturmalıyız. <TD>…</TD>.</p> <p>XSL kullanarak, neyin nasıl dönüştürüleceğini belirten bir şablon (veya stil sayfası) oluşturuyoruz. Sonra bu şablonu kataloğumuza yerleştiriyoruz - ve işiniz bitti: Kataloğu bir tabloya dönüştüren bir XSL şablonunun metnine sahibiz (Liste 2).</p> <p>Dizinimizde bir XSL şablonunu kaplamak için gereken kod şöyle görünür:</p><p>Prosedür TForm1.Button2Click (Gönderen: TObject); var XSLDoc: IXMLDOMDocument; XSLDoc'u başlat: = CoDOMDocument.Create; XSLDoc.Load ('C: \ DATA \ DATA.xsl'); Memo2.Text: = XMLDoc.TransformNode (XSLDoc); XSLDoc: = Sıfır; son;</p><p>XSL tartışmamızı sonlandırırken, şu anda bu dilin çeşitli XML belgeleri arasında dönüştürme ve ayrıca belgeleri biçimlendirmek için aktif olarak kullanıldığı söylenmelidir.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Çözüm</h2> <p>Açık nedenlerden dolayı, tüm Microsoft XML DOM nesnelerini tek bir makalede ele almak ve kullanımlarına ilişkin örnekler sunmak imkansızdır. Burada, uygulamalarda XML DOM kullanmanın temel konularına değindik. Tablo 3, Microsoft XML DOM'de uygulanan tüm nesneleri gösterir.</p> <p>BilgisayarBasın 12 "2000</p> <p>XML, bilgileri depolamak ve uygulamalar ile Web siteleri arasında değiş tokuş etmek için giderek daha fazla kullanılmaktadır. Birçok uygulama bu dili veri depolamak için temel dil olarak kullanırken, diğerleri XML verilerini dışa ve içe aktarmak için kullanır. Bu nedenle, geliştiricilerin XML verilerinin kendi uygulamalarında nasıl kullanılabileceğini düşünmeye başlamalarının zamanı geldi.</p> <p>Bu makalede, XML Belge Nesne Modeli'ne (DOM) ve Microsoft'un XML DOM uygulamasına bakacağız.</p> <p>XML DOM, bir geliştiriciye XML dosyalarını yüklemek ve işlemek için nesneler sağlayan bir nesne modelidir. Nesne modeli şu temel nesnelerden oluşur: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap ve XMLDOMParseError. Bu nesnelerin her biri (XMLDOMParseError hariç), nesne hakkında bilgi almanıza, nesnenin değerlerini ve yapısını değiştirmenize ve bir XML belgesinin yapısında gezinmenize izin veren özellikler ve yöntemler içerir.</p> <p>Ana XML DOM nesnelerine bakalım ve Borland Delphi'deki kullanımlarına ilişkin bazı örnekler gösterelim.</p> <h2>Borland Delphi'de XML DOM Kullanımı</h2> <p>Delphi uygulamalarında Microsoft XML DOM kullanmak için projeye uygun tip kütüphanesini bağlamanız gerekmektedir. Bunu yapmak için Project | komutunu çalıştırıyoruz. Tip Kitaplığını Al ve Tip Kitaplığını Al iletişim kutusunda, genellikle Windows \ System \ MSXML.DLL dosyasında bulunan Microsoft XML sürüm 2.0 (Sürüm 2.0) kitaplığını seçin.</p> <p>Birim Oluştur düğmesine tıkladıktan sonra, XML DOM nesnelerini kullanmamıza izin verecek olan MSXML_TLB arabirim modülü oluşturulacaktır: DOMDocument, XMLDocument, XMLHTTPRequest ve MSXML.DLL kitaplığında uygulanan diğerleri. MSXML_TLB modülüne yapılan başvuru Kullanımlar listesinde olmalıdır.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XML DOM cihazı</h2> <p>Belge Nesne Modeli, dallardan oluşan bir ağaç yapısında bir XML belgesini temsil eder. XML DOM API'leri, uygulamaların belge ağacında gezinmesine ve dallarını değiştirmesine olanak tanır. Her dal, üst ve alt dalların belirlendiği belirli bir türe (DOMNodeType) sahip olabilir. Çoğu XML belgesi, tür öğesi, nitelik ve metin dalları içerir. Nitelikler özel bir dal türüdür ve alt dallar değildir. Nitelikleri değiştirmek için XML DOM nesneleri tarafından sağlanan özel yöntemler kullanılır.</p> <p>Microsoft XML DOM, World Wide Web Consortium (W3C) tarafından önerilen arabirimleri uygulamaya ek olarak, XSL, XSL Modelleri, Ad Alanları ve veri türlerini destekleyen yöntemler içerir. Örneğin, SelectNodes yöntemi, belirli bir bağlamda dalları bulmak için XSL Model Sözdizimini kullanmanıza olanak tanır ve TransformNode yöntemi, dönüşümleri gerçekleştirmek için XSL kullanımını destekler.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XML Belgesini Test Et</h2> <p>Örnek bir XML belgesi olarak, aşağıdaki yapıya sahip bir müzik CD-ROM dizinini ele alalım:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>imparatorluk burlesk Bob Dylan Amerika Birleşik Devletleri Kolombiya 10.90 1985 kalbini sakla bonnie tylor Birleşik Krallık CBS Kayıtları 9.90 1988 ... Kalbimi özgür bırak Joe cocker Amerika Birleşik Devletleri EMI 8.20 1987

Artık XMLDOMDocument nesnesinden başlayarak XML DOM nesne modeline bakmaya hazırız.

XML Belgesi - XMLDOMDocument Nesnesi

Bir XML belgesiyle çalışmak, onu yüklemekle başlar. Bunu yapmak için, yüklenen belgenin URL'sini belirten yalnızca bir parametreye sahip olan Load yöntemini kullanıyoruz. Dosyaları yerel bir diskten yüklerken, yalnızca tam dosya adı belirtilir (bu durumda dosya: /// protokolü atlanabilir). XML belgesi bir dize olarak saklanıyorsa, belgeyi yüklemek için LoadXML yöntemini kullanın.

Async özelliği, belgenin nasıl yüklendiğini (eşzamanlı veya eşzamansız) kontrol etmek için kullanılır. Varsayılan olarak, bu özellik, belgenin eşzamansız olarak yüklendiğini ve belge tamamen yüklenmeden önce kontrolün uygulamaya döndürüldüğünü belirten True olarak ayarlanır. Aksi takdirde, belge eşzamanlı olarak yüklenir ve ardından belgenin yüklenip yüklenmediğini öğrenmek için ReadyState özelliğinin değerini kontrol etmeniz gerekir. Ayrıca ReadyState özelliğinin değeri değiştiğinde denetimi devralacak OnReadyStateChange olayı için bir işleyici oluşturabilirsiniz.

Aşağıdakiler, Load yöntemi kullanılarak bir XML belgesinin nasıl yükleneceğini gösterir:

Kullanır ... MSXML_TLB ... prosedürü TForm1.Button1Click (Gönderen: TObject); var XMLDoc: IXMLDOMDocument; XMLDoc'u başlat: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // // XML belgesini ve dallarını yöneten kodun // XMLDoc: = Nil; son;

Belge yüklendikten sonra özelliklerine erişebiliriz. Böylece, NodeName özelliği #document değerini içerecek, NodeTypeString özelliği belge değerini içerecek ve URL özelliği şu dosyayı içerecek: /// C: /DATA/DATA.xml değeri.

Hata yönetimi

Özellikle ilgi çekici olan, yükleme üzerine belge işleme ile ilgili özelliklerdir. Örneğin, ParseError özelliği, belge işlenirken oluşan bir hata hakkında bilgi içeren bir XMLDOMParseError nesnesi döndürür.

Bir hata işleyicisi yazmak için aşağıdaki kodu ekleyebilirsiniz:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load ('C: \ DATA \ DATA.xml'); XMLError: = XMLDoc.ParseError; Eğer XMLError.ErrorCode<>0 Sonra // // Hatayı burada ele alıyoruz // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Sıfır;

Bir hata durumunda hangi bilgilerin döndürüldüğünü öğrenmek için aşağıdaki dizin girişini değiştirin:

imparatorluk burlesk Bob Dylan Amerika Birleşik Devletleri Kolombiya 10.90 1985

kapatma elemanının çıkarılması ikinci satırda:</p><p> <CD> <TITLE>imparatorluk burlesk <ARTIST>Bob Dylan</ARTIST> <COUNTRY>Amerika Birleşik Devletleri</COUNTRY> <COMPANY>Kolombiya</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Şimdi XMLDOMParseError nesnesinin özellik değerlerini döndüren bir kod yazalım:</p><p>XMLError: = XMLDoc.ParseError; Eğer XMLError.ErrorCode<>0 Sonra XMLError ile, Memo1.Lines Ekle'ye başlar ('Dosya:' + URL); Ekle ('Kod:' + IntToStr (HataKodu)); Ekle ('Hata:' + Sebep); Ekle ('Metin:' + Kaynak Metin); Ekle ('Satır:' + IntToStr (Satır)); Ekle ('Konum:' + IntToStr (LinePos)); Else Memo1.Lines.Add'i sonlandırın (XMLDoc.XML); Son;</p><p>ve uygulamamızı çalıştırın. Sonuç olarak, hata hakkında aşağıdaki bilgileri alıyoruz.</p> <p>Yukarıdaki örnekten de görebileceğiniz gibi, XMLDOMParseError nesnesi tarafından döndürülen bilgiler, hatayı yerelleştirmek ve oluşma nedenini anlamak için oldukça yeterlidir.</p> <p>Şimdi kapatma elemanını geri yükleyeceğiz <TITLE>belgemizde ve XML DOM tartışmamıza devam edin.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Belge ağacına erişme</h2> <p>Belge ağacına erişmek için ya kök öğeyi alabilir ve ardından alt dalları üzerinde yineleyebilir ya da belirli bir dalı bulabilirsiniz. İlk durumda, XMLDOMNode türünde bir nesne döndüren DocumentElement özelliği aracılığıyla kök öğeyi alırız. Her bir alt öğenin içeriğini almak için DocumentElement özelliğini nasıl kullanacağınız aşağıda açıklanmıştır:</p><p>Var Düğüm: IXMLDOMNode; Kök: IXMLDOMElement; Ben: Tamsayı; ... Kök: = XMLDoc.DocumentElement; I için: = 0 - Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Düğüm.Metin); Son;</p><p>XML belgemiz için aşağıdaki metni alıyoruz.</p> <p>Belirli bir dalla veya ilk alt dalın altındaki bir dalla ilgileniyorsak, XMLDOMDocument nesnesinin NodeFromID yöntemini veya GetElementByTagName yöntemini kullanabiliriz.</p> <p>NodeFromID yöntemi, XML Şemasında veya Belge Türü Tanımında (DTD) tanımlandığı gibi benzersiz bir tanımlayıcı gerektirir ve bu tanımlayıcıyla bir dal döndürür.</p> <p>GetElementByTagName yöntemi, belirli bir öğeye (etiket) sahip bir dize gerektirir ve bu öğeye sahip tüm dalları döndürür. CD-ROM dizinimizde tüm sanatçıları bulmak için bu yöntemi nasıl kullanacağınız aşağıda açıklanmıştır:</p><p>Düğümler: IXMLDOMNodeList; Düğüm: IXMLDOMNode; ... Düğümler: = XMLDoc.GetElementsByTagName ('ARTIST'); I için: = 0 - Nodes.Length-1 do Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Düğüm.Metin); Son;</p><p>XML belgemiz için aşağıdaki metni alacağız</p> <p>XMLDOMNode nesnesinin SelectNodes yönteminin belge dallarına erişmek için daha esnek bir yol sağladığını unutmayın. Ama daha fazlası aşağıda.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Belge Dalı - XMLDOMNode Nesnesi</h2> <p>XMLDOMNode nesnesi bir belge dalını temsil eder. Belgenin kök öğesini aldığımızda bu nesneyle zaten karşılaştık:</p><p>Kök: = XMLDoc.DocumentElement;</p><p>Bir XML belgesinin bir dalı hakkında bilgi almak için XMLDOMNode nesnesinin özelliklerini kullanabilirsiniz (Tablo 1).</p> <p>Bir dalda depolanan verilere erişmek için, yaygın olarak ya NodeValue özelliği (öznitelikler, metin dalları, yorumlar, işleme talimatları ve CDATA bölümleri için kullanılabilir) ya da dalın metin içeriğini döndüren Text özelliği kullanılır. veya NodeTypedValue özelliği. Ancak ikincisi, yalnızca yazılan öğelere sahip dallar için kullanılabilir.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Belge ağacında gezinme</h3> <p>XMLDOMNode nesnesi, belge ağacında gezinmek için birçok yol sağlar. Örneğin, üst dala erişmek için ParentNode özelliğini (tür XMLDOMNode) kullanın, alt dallara ChildNodes özellikleri (tür XMLDOMNodeList), FirstChild ve LastChild (XMLDOMNode türü) vb. aracılığıyla erişin. OwnerDocument özelliği, XML belgesinin kendisini tanımlayan bir XMLDOMDocument nesnesi döndürür. Yukarıda listelenen özellikler, belge ağacında gezinmeyi kolaylaştırır.</p> <p>Şimdi XML belgesinin tüm dalları arasında dolaşalım:</p><p>Kök: = XMLDoc.DocumentElement; I için: = 0 - Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Node.HasChildNodes ise GetChilds (Node, 0); Son;</p><p>Yukarıda belirtildiği gibi, XMLDOMNode nesnesinin SelectNodes'u, belge dallarına erişmek için daha esnek bir yol sağlar. Ayrıca, belgenin yalnızca ilk dalını döndüren bir SelectSingleNode yöntemi vardır. Bu yöntemlerin her ikisi de şube aramaları için XSL şablonları tanımlamanıza olanak tanır.</p> <p>Bir CD dalı ve bir PRICE alt dalı olan tüm dalları getirmek için SelectNodes yöntemini kullanma sürecine bakalım:</p><p>Kök: = XMLDoc.DocumentElement; Düğümler: = Root.SelectNodes ('CD / FİYAT');</p><p>CD şubesinin tüm PRICE alt dalları Nodes koleksiyonuna yerleştirilecektir. XSL şablonlarını tartışmaya biraz sonra döneceğiz.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Alt dalları manipüle etme</h3> <p>Alt dalları işlemek için XMLDOMNode nesnesinin yöntemlerini kullanabiliriz (Tablo 2).</p> <p>İlk diskle ilgili kaydı tamamen silmek için aşağıdaki kodu çalıştırmanız gerekir:</p><p>Var XMLDoc: IXMLDOMDocument; Kök: IXMLDOMNode; Düğüm: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // Kök elemanı al Root: = XMLDoc.DocumentElement; Düğüm: = Kök; // İlk alt dal Node.RemoveChild'i (Node.FirstChild) kaldırın;</p><p>Bu örnekte ilk alt dalı sildiğimizi unutmayın. İlk alt dalın ilk öğesinin nasıl kaldırılacağı aşağıda gösterilmiştir:</p><p>Var XMLDoc: IXMLDOMDocument; Kök: IXMLDOMNode; Düğüm: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // Kök elemanı al Root: = XMLDoc.DocumentElement; // ve ilk alt dal Node: = Root.FirstChild; // İlk alt dal Node.RemoveChild'i (Node.FirstChild) kaldırın;</p><p>Yukarıdaki örnekte ilk dalı değil sildik <CD>…</CD> ve dalın ilk elemanı <TITLE>….

Şimdi yeni bir dal ekleyelim. Yeni bir müzik CD-ROM girişinin nasıl ekleneceğini gösteren kod aşağıdadır:

Var NewNode: IXMLDOMNode; Alt: IXMLDOMNode; ... // Yeni bir dal oluştur - NewNode: = XMLDoc.CreateNode (1, 'CD', ''); // Bir eleman ekle Alt: = XMLDoc.CreateNode (1, 'TITLE', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini ayarlayın Child.Text: = 'Pink Floyd'; // Bir eleman ekle <ARTIST>Alt: = XMLDoc.CreateNode (1, 'ARTIST', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini ayarlayın Child.Text: = 'Division Bell'; // Bir eleman ekle <COUNTRY>Alt: = XMLDoc.CreateNode (1, 'ÜLKE', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini Child.Text: = 'UK'; // Bir eleman ekle <COMPANY>Alt: = XMLDoc.CreateNode (1, 'ŞİRKET', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini Child.Text: = 'EMI Records Ltd.'; // Bir eleman ekle <PRICE>Alt: = XMLDoc.CreateNode (1, 'PRICE', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini ayarlayın Child.Text: = '11 .99 "; // Bir eleman ekleyin <YEAR>Alt: = XMLDoc.CreateNode (1, 'YIL', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini Child.Text: = '1994'; // Ve bir Root.AppendChild (NewNode) şubesi ekleyin; ...</p><p>Yukarıdaki kod, yeni bir dal eklemek için aşağıdaki adım sırasını gösterir:</p> <ul><li>CreateNode yöntemini kullanarak yeni bir dal oluşturma: <ul><li>CreateNode yöntemini kullanarak bir öğe oluşturma;</li> <li>AppendChild yöntemini kullanarak bir şubeye eleman ekleme;</li> <li>Text özelliği aracılığıyla bir öğenin değerini ayarlama;</li> <li>… Tüm öğeler için tekrarlayın.</li> </ul></li> <li>AppendChild yöntemini kullanarak belgeye yeni bir dal ekleme.</li> </ul><p>AppendChild yönteminin ağacın sonuna bir dal eklediğini hatırlayın. Ağaçta belirli bir yere dal eklemek için InsertBefore yöntemini kullanmanız gerekir.</p> <h2>Dal kümesi - XMLDOMNodeList nesnesi</h2> <p>XMLNodeList nesnesi, SelectNodes veya GetElementsByTagName yöntemleri kullanılarak oluşturulabilen ve ayrıca ChildNodes özelliğinden elde edilen dalların bir listesini içerir.</p> <p>Bu nesnenin kullanımını "Belge ağacında gezinme" bölümünde sağlanan örnekte zaten tartışmıştık. Burada bazı teorik yorumlar yapacağız.</p> <p>Listedeki dal sayısı, Length özelliğinin değeri olarak alınabilir. Dallar 0'dan Uzunluk-1'e kadar indekslenir ve her bir dal, Item dizisindeki ilgili indekslenmiş öğe aracılığıyla erişilebilir.</p> <p>Dallar listesinde gezinme, listedeki bir sonraki dalı döndüren NextNode yöntemi veya geçerli dal son ise Nil kullanılarak da yapılabilir. Listenin başına dönmek için Sıfırlama yöntemini çağırın.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Belgeler oluşturun ve kaydedin</h2> <p>Bu nedenle, mevcut XML belgelerine nasıl dallar ve öğeler ekleyebileceğinizi ele aldık. Şimdi anında bir XML belgesi oluşturalım. Her şeyden önce, bir belgenin yalnızca bir URL'den değil, aynı zamanda normal bir dizeden de yüklenebileceğini unutmayın. Daha sonra öğelerin geri kalanını dinamik olarak oluşturmak için kullanılabilecek bir kök öğenin nasıl oluşturulacağı aşağıda açıklanmıştır (daha önce Alt Dalları Manipüle Etme bölümünde ele almıştık):</p><p>Var XMLDoc: IXMLDOMDocument; Kök: IXMLDOMNode; Düğüm: IXMLDOMNode; S: Geniş Dize; ... S: = ' <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.LoadXML (S); Kök: = XMLDoc.DocumentElement; Düğüm: = XMLDoc.CreateNode (1, 'CD', ''); Root.AppendChild (Düğüm); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Sıfır;</p><p>XML belgesini oluşturduktan sonra Kaydet yöntemini kullanarak bir dosyaya kaydedin. Örneğin:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML');</p> <p>Kaydet yöntemi, bir dosyaya kaydetmeye ek olarak, bir XML belgesini yeni bir XMLDOMDocument nesnesine kaydetmenize olanak tanır. Bu durumda, belge tamamen işlenir ve sonuç olarak yapısı ve sözdizimi kontrol edilir. Bir belgeyi başka bir nesneye nasıl kaydedeceğiniz aşağıda açıklanmıştır:</p><p>Prosedür TForm1.Button2Click (Gönderen: TObject); var XMLDoc2: IXMLDOMDocument; XMLDoc2'yi başlat: = CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: = Sıfır; son;</p><p>Sonuç olarak, Kaydet yöntemi, XML belgesini IStream, IPersistStream veya IPersistStreamInit arabirimlerini destekleyen diğer COM nesnelerine kaydetmenize de olanak tanır.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XSL Şablonlarını Kullanma</h2> <p>XMLDOMNode nesnesinin SelectNodes yöntemini tartışırken, belge dallarına erişmek için daha esnek bir yol sağladığından bahsetmiştik. Esneklik, dalları seçme kriteri olarak bir XSL şablonu belirtebilmenizdir. Bu tür şablonlar, XML belgelerinde bilgi bulmak için güçlü bir mekanizma sağlar. Örneğin, dizinimizde bulunan tüm müzik CD-ROM başlıklarının bir listesini almak için aşağıdaki sorguyu çalıştırabilirsiniz:</p><p>ABD'de hangi sanatçıların disklerinin yayınlandığını öğrenmek için talep şu şekilde oluşturulur:</p><p>Düğümler: = Root.SelectNodes ('CD / SANATÇI');</p><p>Bir dizindeki ilk sürücüyü nasıl bulacağınız aşağıda açıklanmıştır:</p><p>Düğümler: = Root.SelectNodes ('CD / TITLE');</p><p>Ve son olarak:</p><p>Düğümler: = Root.SelectNodes ('CD / TITLE');</p><p>Bob Dylan'ın disklerini bulmak için aşağıdaki sorguyu çalıştırabilirsiniz:</p><p>Düğümler: = Root.SelectNodes ('CD [$ herhangi bir $ SANATÇI =" Bob Dylan "] / BAŞLIK');</p><p>ve 1985'ten sonra yapılan disklerin bir listesini almak için aşağıdaki sorguyu çalıştırıyoruz:</p><p>Düğümler: = Root.SelectNodes ('CD / TITLE');</p><p>XSL sözdiziminin daha ayrıntılı bir tartışması ayrı bir yayın gerektirir. Okuyucuların ilgisini çekmek ve daha fazla araştırmayı teşvik etmek için, XSL'nin olası kullanımına dair sadece küçük bir örnek vereceğim. Diyelim ki kataloğumuzu normal bir HTML tablosuna dönüştürmemiz gerekiyor. Geleneksel yöntemleri kullanarak, ağacın tüm dallarını yinelemeliyiz ve alınan her eleman için karşılık gelen etiketleri oluşturmalıyız. <TD>…</TD>.</p> <p>XSL kullanarak, neyin nasıl dönüştürüleceğini belirten bir şablon (veya stil sayfası) oluşturuyoruz. Sonra bu şablonu kataloğumuza yerleştiriyoruz - ve işiniz bitti: Kataloğu bir tabloya dönüştüren bir XSL şablonunun metnine sahibiz (Liste 2).</p> <p>Dizinimizde bir XSL şablonunu kaplamak için gereken kod şöyle görünür:</p><p>Prosedür TForm1.Button2Click (Gönderen: TObject); var XSLDoc: IXMLDOMDocument; XSLDoc'u başlat: = CoDOMDocument.Create; XSLDoc.Load ('C: \ DATA \ DATA.xsl'); Memo2.Text: = XMLDoc.TransformNode (XSLDoc); XSLDoc: = Sıfır; son;</p><p>XSL tartışmamızı sonlandırırken, şu anda bu dilin çeşitli XML belgeleri arasında dönüştürme ve ayrıca belgeleri biçimlendirmek için aktif olarak kullanıldığı söylenmelidir.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Çözüm</h2> <p>Açık nedenlerden dolayı, tüm Microsoft XML DOM nesnelerini tek bir makalede ele almak ve kullanımlarına ilişkin örnekler sunmak imkansızdır. Burada, uygulamalarda XML DOM kullanmanın temel konularına değindik. Tablo 3, Microsoft XML DOM'de uygulanan tüm nesneleri gösterir.</p> <p>BilgisayarBasın 12 "2000</p> <p>Herkese hoş geldiniz! Birkaç yıldır Matlab'da yazıyorum ve sonra Delphi'de bir program yazmak için sabırsızlanıyordum.</p><p>xml belgeleriyle çalışmayı öğrenmem gerekiyor. RAD Stiduo XE3'te çalışıyorum. Muhtemelen birçok Delphi programcısı tarafından bilinen bir TXMLDocument bileşeni vardır. Çok şey yapabilecek gibi görünüyor. Ancak sorun şu ki, bunun için net bir belge ve açıklama yok. RAD Studio'daki yardım saçmalık çünkü orada normal bir bilgi yok; sadece bazı yöntemler ve prosedürler hakkında yetersiz yardım sayfalarına dağılmıştır (örnek ve normal açıklama yoktur). Tüm interneti karıştırdı. Yalnızca, bir xml dosyasına erişimle ilgili şu veya bu satırın ne yaptığını bir saat daha tahmin etmeniz gereken belirli sorunlara çözümler içeren forumlarda konular bulundu. <br>Ayrıca xml ile çalışırken kullanılan ana işlevler, prosedürler ve yöntemler hakkında bir kılavuza ihtiyacım var. Ders kitabı, el kitabı, açıklama. Veya en azından "aptallar için Delphi'de xml". Örneğin:</p><p><i>Bir xml dosyasını açmak için XMLDocument1.LoadFromFile ("filemane.xml") yöntemini kullanın; burada dosya adı dosyanın adıdır. <br>IXMLNode türünün değişken düğüm listesi, alt öğelerin listesini depolamak için kullanılır. Bu listeyi tanımlamak için Xmldocument1.DocumentElement yöntemi (burada XMLDocument1 incelenecek xml dosyasıdır) kullanılır. <br>"element1" alt öğesinin içeriğini sorgulamak için XMLDocument1.DocumentElement.ChildNodes ["element1"].Text ... yöntemini kullanın. <br></i><br>ve bu ruhla, uygulanan tüm yöntemler, prosedürler, veri türleri hakkında daha fazla bilgi. <br>Benzer kılavuzları / açıklamaları nerede bulabilirim? Kim yardım edebilir?</p><p>Belirli bir göreve ihtiyacınız varsa, onu tarif edeceğim. <br>Formun bir xml belgesi var:</p><p> <br><ltm version="1.0" type="settings" ><br><progname>LTM</progname></p><p><templateFiles><br> <assets>fon.png</assets><br> <assets>yukarı.jpg</assets><br> <images><br> <pano> <tiles>pano_u.jpg</tiles><br> <tiles>pano_f.jpg</tiles><br> </pano><br> <tour><br> <tourimages>başlangıç.jpg</tourimages><br> <tourimages>tmb.jpg</tourimages><br> </tour><br> </images><br></templateFiles><br><dimensions><br> <tiles type="pc">1910</tiles><br> <tiles type="ipad">768</tiles><br> <tiles side="iphone">512</tiles><br> <tourimages name="start.jpg" edge="long">1024</tourimages><br> <tourimages name="start.jpg" edge="short">768</tourimages><br></dimensions></p><p><hotspot name="hs015_2" style="mappoint" scena="scene017" ath="68.17644363437007" /><br><hotspot name="hs015_1" style="mappoint" scena="scene014" rz="4436007" /> <br><data name="onstart" mode="noVoice">Bazı metin</data><br><data name="onerror" mode="noVoice">Bazı hata metni</data><br><data name="onerror" mode="alarm">Diğer hata metni</data></p><p>Program kodunda biz var:</p><p>var <br>...<br>ebeveyn, çocuk1: IXMLNode;</p><p>başlamak <br>XMLDocument1.LoadFromFile ("f: \ dosyaadı.x ml"); <br>XMLDocument1.Active: = doğru; <br>.<br>.<br>son</p><p>Yapmayı öğrenmeniz gerekenler: <br>(xml belgesinin bileşenlerini yanlış adlandırdıysam şimdiden özür dilerim) <br>1. Kök öğenin adını (bizim durumumuzda ltm), niteliklerinin (sürüm, tür) ve değerlerinin ("1.0", "ayarlar") bir listesini alın. <br>2. Kökün alt öğeleri olan öğelerin sayısını alın. Bu durumda 7 tane vardır: şablonDosyaları, boyutlar, etkin nokta, etkin nokta, veri, veri, veri. Öğelerin (etiketlerin) adlarını alın (şablonDosyaları, boyutlar, vb.). Elemanların sayısını ve isimlerini nasıl çıkaracağımı öğrendikten sonra, 0'dan sayı-1'e döngü yapacağım ve ihtiyacım olanı yapacağım. <br>3. Gerekli öğenin niteliklerinin sayısını ve listesini alın. Örneğin, etkin nokta öğesi için. Doğru cevap 4 nitelik olacaktır. İlk etkin nokta öğesi için bunlar ad, stil, sahne, ath olacaktır. İkincisi için - aynı, yalnızca ath özniteliği yerine - rz özniteliği. <br>Dosyada farklı niteliklere sahip 2 etkin nokta öğesi bulunduğuna dikkat edin. Onlarla nasıl çalışacağınız aşağıda açıklanmıştır (aynı ada sahip 1'den fazla öğe varsa)? <br>Bunun gibi istiyorum: rel'e göre çocukların bir listesini alıyorum. kök birine (bkz. s. 2), bunlar arasında bir for döngüsü çalıştırın ve name parametresinin gerekli olana eşit olduğu etkin nokta öğelerini bulun ("hs015_2" deyin - kesinlikle böyle bir öğe olacaktır). Bu sorunu bir döngü olmadan bir şekilde çözmek mümkün mü? Diğer bir deyişle, name = "hs015_2" olan etkin nokta öğesi için scena özniteliğinin değerini alın? <br>4. Çocuklara göre alt öğe olan düğümler ve öğeler için yukarıdakileri yapın. Örneğimde, bir düğüm (ve öğesinin çocuğu ve ebeveyni. <br>Doğru anlarsam, düğümün içeriğini bir şekilde aktarmanız gerekir. <a href="https://obanracer.ru/tr/tipy-peremennyh-visual-basic-yazyk-programmirovaniya-visual-basic-tipy-dannyh.html">değişken gibi</a> IXMLNode'u seçin ve 1-3 arasındaki öğelerin aynısını yapın. Yani?</p><p>5. Yukarıdaki parametreleri nasıl değiştireceğinizi öğrenmeniz gerekir (kendinizi ayarlayın).</p><p>Şimdiye kadar görünüyor. Bu aşamada, sözdizimsel yapılar benim için çok önemlidir. <br>Bu konunun sahibi kim, lütfen yukarıdaki sorunları çözmek için diğer sözdizimsel yapıları yazın (niteliklerin nasıl elde edileceği, sayıları, öğelerin sayısı, adları vb.). Şimdi asıl mesele söz diziminde ustalaşmak ve algoritmamı daha sonra uygulayacağım. Şimdiden çok teşekkürler!</p><p>not Mevcut olanlar için normal bir açıklama olmadığı için gerçekten kendi XML ayrıştırıcımı sıfırdan yazmak istemem.</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 style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div> </div> <footer> <div class="td-block-row td-post-next-prev"> <div class="td-block-span6 td-post-prev-post"> <div class="td-post-next-prev-content"><span>önceki makale</span><a href="https://obanracer.ru/tr/iz-kakih-otelei-v-yalove-otkryvayutsya-krasivye-vidy-yalova.html">Yalova Türkiye: kaplıcalar, tedavi, oteller, fiyatlar, yorumlar Termal su arıtma için tedavi yöntemleri ve dozajları</a></div> </div> <!-- /next_post --> <div class="td-next-prev-separator"></div> <div class="td-block-span6 td-post-next-post"> <div class="td-post-next-prev-content"><span>Sonraki makale</span><a href="https://obanracer.ru/tr/viktoriya-gorod-v-ispanii-otkryt-levoe-menyu-vitoriya-gasteis-ot.html">Sol menüyü açın Vitoria-Gastais</a></div> <!-- /next_post --> </div> </div> <div class="td-author-name vcard author" style="display: none"><span class="fn"><a href="https://obanracer.ru/tr/author/iulia">Julia</a></span></div> <span style="display: none;" itemprop="author" itemscope itemtype="https://schema.org/Person"><meta itemprop="name" content="Юлия"></span> <meta itemprop="datePublished" content="2016-05-16T15:47:37+00:00"> <meta itemprop="dateModified" content="2016-10-25T16:54:41+00:00"> <meta itemscope itemprop="mainEntityOfPage" itemType="https://schema.org/WebPage" itemid="/other/kak-zavyazat-galstuk-foto-poshagovo.html" /><span style="display: none;" itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><span style="display: none;" itemprop="logo" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="//obanracer.ru/wp-content/uploads/2017/01/logo-300x100.png"></span> <meta itemprop="name" content="Мой секрет"> </span> <meta itemprop="headline " content="Как завязать галстук пошагово фото"><span style="display: none;" itemprop="image" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="/wp-content/uploads/2016/05/1-19.jpg"><meta itemprop="width" content="640"><meta itemprop="height" content="450"></span> </footer> </article> <div class="td_block_wrap td_block_related_posts td_uid_3_5a236fb03c961_rand td_with_ajax_pagination td-pb-border-top td_block_template_1" data-td-block-uid="td_uid_3_5a236fb03c961" ><script>var block_td_uid_3_5a236fb03c961 = new tdBlock(); block_td_uid_3_5a236fb03c961.id = "td_uid_3_5a236fb03c961"; block_td_uid_3_5a236fb03c961.atts = '{ "limit":9,"sort":"","post_ids":"","tag_slug":"","autors_id":"","installed_post_types":"","category_id":"","category_ids":"","custom_title":"","custom_url":"","show_child_cat":"","sub_cat_ajax":"","ajax_pagination":"next_prev","header_color":"","header_text_color":"","ajax_pagination_infinite_stop":"","td_column_number":3,"td_ajax_preloading":"","td_ajax_filter_type":"td_custom_related","td_ajax_filter_ids":"","td_filter_default_txt":"\u0412\u0441\u0435","color_preset":"","border_top":"","class":"td_uid_3_5a236fb03c961_rand","el_class":"","offset":"","css":"","tdc_css":"","tdc_css_class":"td_uid_3_5a236fb03c961_rand","live_filter":"cur_post_same_categories","live_filter_cur_post_id":10046,"live_filter_cur_post_author":"694350","block_template_id":""} '; block_td_uid_3_5a236fb03c961.td_column_number = "3"; block_td_uid_3_5a236fb03c961.block_type = "td_block_related_posts"; block_td_uid_3_5a236fb03c961.post_count = "9"; block_td_uid_3_5a236fb03c961.found_posts = "26"; block_td_uid_3_5a236fb03c961.header_color = ""; block_td_uid_3_5a236fb03c961.ajax_pagination_infinite_stop = ""; block_td_uid_3_5a236fb03c961.max_num_pages = "3"; tdBlocksArray.push(block_td_uid_3_5a236fb03c961); </script><h4 class="td-related-title td-block-title"><a id="td_uid_4_5a236fb03e35d" class="td-related-left td-cur-simple-item" data-td_filter_value="" data-td_block_id="td_uid_3_5a236fb03c961" href="#">BENZER MAKALELER</a></h4><div id=td_uid_3_5a236fb03c961 class="td_block_inner"> <div class="td-related-row"> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/nikshich-chernogoriya-otdyh-v-nikshiche-kak-naiti-krepost-bedem.html" rel="bookmark" title="Niksic karadağ. Niksic'te dinlenin. Bedem kalesi nasıl bulunur"><img width="218" height="150" class="entry-thumb" src="/uploads/6f8b80f2da267157648a0fa43baedade.jpg" alt="Niksic karadağ. Niksic'te dinlenin. Bedem kalesi nasıl bulunur" title="Niksic karadağ. Niksic'te dinlenin. Bedem kalesi nasıl bulunur"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/windows-7/" class="td-post-category">Windows 7</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/nikshich-chernogoriya-otdyh-v-nikshiche-kak-naiti-krepost-bedem.html" rel="bookmark" title="Niksic karadağ. Niksic'te dinlenin. Bedem kalesi nasıl bulunur">Niksic karadağ. Niksic'te dinlenin. Bedem kalesi nasıl bulunur</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/gornolyzhnyi-kurort-san-martino-di-kastrocca-san-martino-di-castrozza.html" rel="bookmark" title="San Martino di Castrozza kayak merkezi"><img width="218" height="150" class="entry-thumb" src="/uploads/654405e3254addfea16438944933e7a7.jpg" alt="San Martino di Castrozza kayak merkezi" title="San Martino di Castrozza kayak merkezi"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/windows-7/" class="td-post-category">Windows 7</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/gornolyzhnyi-kurort-san-martino-di-kastrocca-san-martino-di-castrozza.html" rel="bookmark" title="San Martino di Castrozza kayak merkezi">San Martino di Castrozza kayak merkezi</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/otdyh-v-preshove-luchshie-ceny-na-tury-v-preshov-chto-takoe.html" rel="bookmark" title="Analiz çerezleri nedir"><img width="218" height="150" class="entry-thumb" src="/uploads/d1d60bb08439ce97aaff05b1878f74ca.jpg" alt="Analiz çerezleri nedir" title="Analiz çerezleri nedir"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/internet/" class="td-post-category">internet</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/otdyh-v-preshove-luchshie-ceny-na-tury-v-preshov-chto-takoe.html" rel="bookmark" title="Analiz çerezleri nedir">Analiz çerezleri nedir</a></h3> </div> </div> </div> </div> <div class="td-related-row"> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/glavnye-dostoprimechatelnosti-preshova-spisok-foto-i-opisanie-otdyh-v.html" rel="bookmark" title="Presov'da tatiller, presov turları için en iyi fiyatlar Gizlilik ayarlarını değiştirin"><img width="218" height="150" class="entry-thumb" src="/uploads/2c22795d18aaa6ebe9bdbf603da5f102.jpg" alt="Presov'da tatiller, presov turları için en iyi fiyatlar Gizlilik ayarlarını değiştirin" title="Presov'da tatiller, presov turları için en iyi fiyatlar Gizlilik ayarlarını değiştirin"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/ram/" class="td-post-category">Veri deposu</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/glavnye-dostoprimechatelnosti-preshova-spisok-foto-i-opisanie-otdyh-v.html" rel="bookmark" title="Presov'da tatiller, presov turları için en iyi fiyatlar Gizlilik ayarlarını değiştirin">Presov'da tatiller, presov turları için en iyi fiyatlar Gizlilik ayarlarını değiştirin</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/gorod-puate-puate-gorod-cerkvei-i-treh-istoricheskih.html" rel="bookmark" title="Poitiers - bir kiliseler şehri ve üç tarihi savaş"><img width="218" height="150" class="entry-thumb" src="/uploads/517057f6b9a3ad0e36026530081a3b33.jpg" alt="Poitiers - bir kiliseler şehri ve üç tarihi savaş" title="Poitiers - bir kiliseler şehri ve üç tarihi savaş"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/security/" class="td-post-category">Güvenlik</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/gorod-puate-puate-gorod-cerkvei-i-treh-istoricheskih.html" rel="bookmark" title="Poitiers - bir kiliseler şehri ve üç tarihi savaş">Poitiers - bir kiliseler şehri ve üç tarihi savaş</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/buhta-entoni-kuinna-kak-dobratsya-iz-faliraki-plyazh-entoni-kuinna-na-rodose.html" rel="bookmark" title="Anthony Quinn Plajı, Rodos'ta"><img width="218" height="150" class="entry-thumb" src="/uploads/68fbf2bde508c7cc691cb07e3b0cff70.jpg" alt="Anthony Quinn Plajı, Rodos'ta" title="Anthony Quinn Plajı, Rodos'ta"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/windows-7/" class="td-post-category">Windows 7</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/buhta-entoni-kuinna-kak-dobratsya-iz-faliraki-plyazh-entoni-kuinna-na-rodose.html" rel="bookmark" title="Anthony Quinn Plajı, Rodos'ta">Anthony Quinn Plajı, Rodos'ta</a></h3> </div> </div> </div> </div> <div class="td-related-row"> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/gornolyzhnye-kurorty-finlyandii-yullyas-gornolyzhnyi-kurort-yullyas-izmenenie.html" rel="bookmark" title="Finlandiya'daki kayak merkezleri"><img width="218" height="150" class="entry-thumb" src="/uploads/954d052bab735b7eb98d7ee5505312fa.jpg" alt="Finlandiya'daki kayak merkezleri" title="Finlandiya'daki kayak merkezleri"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/case/" class="td-post-category">Konutlar</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/gornolyzhnye-kurorty-finlyandii-yullyas-gornolyzhnyi-kurort-yullyas-izmenenie.html" rel="bookmark" title="Finlandiya'daki kayak merkezleri">Finlandiya'daki kayak merkezleri</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/otdyh-v-kolobzhege-polskii-kurort-kolobzheg-planiruem-otdyh-na-more.html" rel="bookmark" title="Polonya tatil beldesi Kolobrzeg: yurtdışında bir deniz tatili planlamak Kolobrzeg'de eğlence ve turistik yerler"><img width="218" height="150" class="entry-thumb" src="/uploads/9d143832647b929b91d9c817be8fd072.jpg" alt="Polonya tatil beldesi Kolobrzeg: yurtdışında bir deniz tatili planlamak Kolobrzeg'de eğlence ve turistik yerler" title="Polonya tatil beldesi Kolobrzeg: yurtdışında bir deniz tatili planlamak Kolobrzeg'de eğlence ve turistik yerler"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/ram/" class="td-post-category">Veri deposu</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/otdyh-v-kolobzhege-polskii-kurort-kolobzheg-planiruem-otdyh-na-more.html" rel="bookmark" title="Polonya tatil beldesi Kolobrzeg: yurtdışında bir deniz tatili planlamak Kolobrzeg'de eğlence ve turistik yerler">Polonya tatil beldesi Kolobrzeg: yurtdışında bir deniz tatili planlamak Kolobrzeg'de eğlence ve turistik yerler</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/otdyh-v-argose-argos-odin-iz-samyh-drevnih-gorodov-evropy-chto-takoe.html" rel="bookmark" title="Argos, Avrupa'nın en eski şehirlerinden biridir Pazarlama çerezleri nelerdir"><img width="218" height="150" class="entry-thumb" src="/uploads/fcb72e9fb1089d2bf727aae8a6ca7bb9.jpg" alt="Argos, Avrupa'nın en eski şehirlerinden biridir Pazarlama çerezleri nelerdir" title="Argos, Avrupa'nın en eski şehirlerinden biridir Pazarlama çerezleri nelerdir"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/internet/" class="td-post-category">internet</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/otdyh-v-argose-argos-odin-iz-samyh-drevnih-gorodov-evropy-chto-takoe.html" rel="bookmark" title="Argos, Avrupa'nın en eski şehirlerinden biridir Pazarlama çerezleri nelerdir">Argos, Avrupa'nın en eski şehirlerinden biridir Pazarlama çerezleri nelerdir</a></h3> </div> </div> </div> </div></div></div> </div> </div> <div class="td-pb-span4 td-main-sidebar"> <div class="td-ss-main-sidebar"> <aside class="widget �lambda_169101"> <div style="margin:10px 0"> </div> </aside> <div class="td_block_wrap td_block_1 td_block_widget td_uid_2_5a23c04f0cdc0_rand td-pb-border-top td_block_template_1 td-column-1" data-td-block-uid="td_uid_2_5a23c04f0cdc0"> <div class="td-block-title-wrap"> <h4 class="block-title"><span class="td-pulldown-size">Tavsiye edilen</span></h4> </div> <div id=td_uid_2_5a23c04f0cdc0 class="td_block_inner"> <div class="td-block-span12"> <div class="td_module_4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/boinice-trenchin-gde-normalno-perenochevat-dostoprimechatelnosti-i-interesnye-mesta-trenchina-obzor.html" rel="bookmark" title="Trencin'in görülecek yerleri ve ilginç yerleri: genel bakış ve fotoğraflar"><img width="324" height="235" class="entry-thumb" src="/uploads/8163ad22d531089bc1bac8d0370f1612.jpg" alt="Trencin'in görülecek yerleri ve ilginç yerleri: genel bakış ve fotoğraflar" title="Trencin'in görülecek yerleri ve ilginç yerleri: genel bakış ve fotoğraflar"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/tr/category/processors/" class="td-post-category">işlemciler</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/boinice-trenchin-gde-normalno-perenochevat-dostoprimechatelnosti-i-interesnye-mesta-trenchina-obzor.html" rel="bookmark" title="Trencin'in görülecek yerleri ve ilginç yerleri: genel bakış ve fotoğraflar">Trencin'in görülecek yerleri ve ilginç yerleri: genel bakış ve fotoğraflar</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">Slovakya'nın batısında güzel ve ilginç bir şehir var. Bu şehir Trencin. Ortasında büyük bir kaya yükselir ve üzerinde inşa edilmiş bir kale vardır ...</div> </div> <!-- /next_post --> </div> <div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/maribor-gorod-istoriya-komandy-suveniry-chto-privezti-v-podarok.html" rel="bookmark" title="Maribor şehri. Takım geçmişi. Hatıra Eşyası. Hediye olarak ne getirmeli"><img width="100" height="70" class="entry-thumb" src="/uploads/97716820e5b9d233de553324ca2927cd.jpg" alt="Maribor şehri. Takım geçmişi. Hatıra Eşyası. Hediye olarak ne getirmeli" title="Maribor şehri. Takım geçmişi. Hatıra Eşyası. Hediye olarak ne getirmeli"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/maribor-gorod-istoriya-komandy-suveniry-chto-privezti-v-podarok.html" rel="bookmark" title="Maribor şehri. Takım geçmişi. Hatıra Eşyası. Hediye olarak ne getirmeli">Maribor şehri. Takım geçmişi. Hatıra Eşyası. Hediye olarak ne getirmeli</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/tr/category/case/" class="td-post-category">Konutlar</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/panamskii-kanal-istoriya-i-fakty-kak-eto-bylo-stroitelstvo-panamskogo-kanala.html" rel="bookmark" title="Panama Kanalı. Tarih ve gerçekler. Nasıldı. Panama Kanalı inşaatı Panama Kanalı açıldı"><img width="100" height="70" class="entry-thumb" src="/uploads/f10b1c9efd8228ae75d079e927312aba.jpg" alt="Panama Kanalı. Tarih ve gerçekler. Nasıldı. Panama Kanalı inşaatı Panama Kanalı açıldı" title="Panama Kanalı. Tarih ve gerçekler. Nasıldı. Panama Kanalı inşaatı Panama Kanalı açıldı"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/panamskii-kanal-istoriya-i-fakty-kak-eto-bylo-stroitelstvo-panamskogo-kanala.html" rel="bookmark" title="Panama Kanalı. Tarih ve gerçekler. Nasıldı. Panama Kanalı inşaatı Panama Kanalı açıldı">Panama Kanalı. Tarih ve gerçekler. Nasıldı. Panama Kanalı inşaatı Panama Kanalı açıldı</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/tr/category/processors/" class="td-post-category">işlemciler</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/kak-dobratsya-do-telebashni-vostochnaya-zhemchuzhina-shanhai-shanhaiskaya.html" rel="bookmark" title="Şanghay TV Kulesi - Doğu İncisi"><img width="100" height="70" class="entry-thumb" src="/uploads/9a69c5e916b45be0515aaa6d77cb18ee.jpg" alt="Şanghay TV Kulesi - Doğu İncisi" title="Şanghay TV Kulesi - Doğu İncisi"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/kak-dobratsya-do-telebashni-vostochnaya-zhemchuzhina-shanhai-shanhaiskaya.html" rel="bookmark" title="Şanghay TV Kulesi - Doğu İncisi">Şanghay TV Kulesi - Doğu İncisi</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/tr/category/processors/" class="td-post-category">işlemciler</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/sozdanie-zaprosov-v-sql-server-zaprosy-v-access-chto-takoe-sql.html" rel="bookmark" title="Sql sunucusunda sorgu oluşturma"><img width="100" height="70" class="entry-thumb" src="/uploads/d111825aeecbde2713a46f082828b95f.jpg" alt="Sql sunucusunda sorgu oluşturma" title="Sql sunucusunda sorgu oluşturma"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/sozdanie-zaprosov-v-sql-server-zaprosy-v-access-chto-takoe-sql.html" rel="bookmark" title="Sql sunucusunda sorgu oluşturma">Sql sunucusunda sorgu oluşturma</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/tr/category/processors/" class="td-post-category">işlemciler</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/nansi-na-mozele-nansi-malenkii-gorod-i-ego-bolshaya-istoriya-izmenenie.html" rel="bookmark" title="Nancy - küçük bir kasaba ve büyük tarihi"><img width="100" height="70" class="entry-thumb" src="/uploads/edeb27e1576154949e29a9f4c7880c72.jpg" alt="Nancy - küçük bir kasaba ve büyük tarihi" title="Nancy - küçük bir kasaba ve büyük tarihi"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/nansi-na-mozele-nansi-malenkii-gorod-i-ego-bolshaya-istoriya-izmenenie.html" rel="bookmark" title="Nancy - küçük bir kasaba ve büyük tarihi">Nancy - küçük bir kasaba ve büyük tarihi</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/tr/category/monitors/" class="td-post-category">monitörler</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/ispaniya-logrono-logrono-ispaniya-gorod-logrono-ispaniya.html" rel="bookmark" title="Logroño - İspanya Logroño Şehri İspanya"><img width="100" height="70" class="entry-thumb" src="/uploads/5d79179abb99838b224f2fa4d4d1484c.jpg" alt="Logroño - İspanya Logroño Şehri İspanya" title="Logroño - İspanya Logroño Şehri İspanya"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/ispaniya-logrono-logrono-ispaniya-gorod-logrono-ispaniya.html" rel="bookmark" title="Logroño - İspanya Logroño Şehri İspanya">Logroño - İspanya Logroño Şehri İspanya</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/tr/category/power-supply/" class="td-post-category">Güç kaynakları</a> </div> </div> </div> </div> </div> </div> </div> <aside class="widget_text td_block_template_1 widget widget_custom_html"> <div class="textwidget custom-html-widget"> </div> </aside> </div> </div> </div> </div> </div> <div class="td-footer-wrapper td-container-wrap "> <div class="td-container"> <div class="td-pb-row"> <div class="td-pb-span12"> </div> </div> <div class="td-pb-row"> <div class="td-pb-span4"> <div class="td_block_wrap td_block_15 td_block_widget td_uid_11_5a23980e76adb_rand td-pb-border-top td_block_template_1 td-column-1 td_block_padding" data-td-block-uid="td_uid_11_5a23980e76adb" > <div class="td-block-title-wrap"></div><div id=td_uid_11_5a23980e76adb class="td_block_inner td-column-1"><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/logrono-ispaniya-dostoprimechatelnosti-puteshestvie-v-ispaniyu.html" rel="bookmark" title="İspanya'ya Seyahat: Logroño ve Pamplona"><img width="218" height="150" class="entry-thumb" src="/uploads/611671e969afc1cee957c290902767d9.jpg" alt="İspanya'ya Seyahat: Logroño ve Pamplona" title="İspanya'ya Seyahat: Logroño ve Pamplona"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/logrono-ispaniya-dostoprimechatelnosti-puteshestvie-v-ispaniyu.html" rel="bookmark" title="İspanya'ya Seyahat: Logroño ve Pamplona">İspanya'ya Seyahat: Logroño ve Pamplona</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/stoimost-zameny-stekla-na-ipad-stoimost-zameny-stekla-na-ipad-skolko-budet.html" rel="bookmark" title="iPad'de cam değiştirmenin maliyeti iPad'de cam değiştirmenin maliyeti"><img width="218" height="150" class="entry-thumb" src="/uploads/544e972575b6c37affc92be535482fa3.jpg" alt="iPad'de cam değiştirmenin maliyeti iPad'de cam değiştirmenin maliyeti" title="iPad'de cam değiştirmenin maliyeti iPad'de cam değiştirmenin maliyeti"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/stoimost-zameny-stekla-na-ipad-stoimost-zameny-stekla-na-ipad-skolko-budet.html" rel="bookmark" title="iPad'de cam değiştirmenin maliyeti iPad'de cam değiştirmenin maliyeti">iPad'de cam değiştirmenin maliyeti iPad'de cam değiştirmenin maliyeti</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/garantiya-makbuk-oficialnaya-garantiya-apple-v-rossii-kakie-usloviya-i-kak.html" rel="bookmark" title="Apple'ın Rusya'daki resmi garantisi: hangi koşullar ve nasıl kontrol edilir"><img width="218" height="150" class="entry-thumb" src="/uploads/d5753cc8af22f6b2c0f2251cf18b2fcd.jpg" alt="Apple'ın Rusya'daki resmi garantisi: hangi koşullar ve nasıl kontrol edilir" title="Apple'ın Rusya'daki resmi garantisi: hangi koşullar ve nasıl kontrol edilir"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/garantiya-makbuk-oficialnaya-garantiya-apple-v-rossii-kakie-usloviya-i-kak.html" rel="bookmark" title="Apple'ın Rusya'daki resmi garantisi: hangi koşullar ve nasıl kontrol edilir">Apple'ın Rusya'daki resmi garantisi: hangi koşullar ve nasıl kontrol edilir</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/ne-rabotaet-naushnik-iphone-chto-delat-preimushchestva-obrashcheniya-v-modmac.html" rel="bookmark" title="iPhone kulaklık çalışmıyor"><img width="218" height="150" class="entry-thumb" src="/uploads/cabc28bd3982c64f0b66bc197f9f8930.jpg" alt="iPhone kulaklık çalışmıyor" title="iPhone kulaklık çalışmıyor"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/ne-rabotaet-naushnik-iphone-chto-delat-preimushchestva-obrashcheniya-v-modmac.html" rel="bookmark" title="iPhone kulaklık çalışmıyor">iPhone kulaklık çalışmıyor</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/reshenie-problemy-s-mercayushchei-podsvetkoi-na-imac-net-podsvetki-ne-rabotaet.html" rel="bookmark" title="iMac'te titreyen arka ışıkla ilgili sorunu çözme"><img width="218" height="150" class="entry-thumb" src="/uploads/d4ec850254dc94d89dfc2c82cffeb46e.jpg" alt="iMac'te titreyen arka ışıkla ilgili sorunu çözme" title="iMac'te titreyen arka ışıkla ilgili sorunu çözme"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/reshenie-problemy-s-mercayushchei-podsvetkoi-na-imac-net-podsvetki-ne-rabotaet.html" rel="bookmark" title="iMac'te titreyen arka ışıkla ilgili sorunu çözme">iMac'te titreyen arka ışıkla ilgili sorunu çözme</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/zamena-stekla-na-ipad-pro-chto-nuzhno-znat-instrumenty-i.html" rel="bookmark" title="iPad Pro'da camı değiştirme"><img width="218" height="150" class="entry-thumb" src="/uploads/e5bae0c6a249ac0c8d49868dfff1b14e.jpg" alt="iPad Pro'da camı değiştirme" title="iPad Pro'da camı değiştirme"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/zamena-stekla-na-ipad-pro-chto-nuzhno-znat-instrumenty-i.html" rel="bookmark" title="iPad Pro'da camı değiştirme">iPad Pro'da camı değiştirme</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div> </div> <div class="td-pb-span4"> <div class="td_block_wrap td_block_15 td_block_widget td_uid_12_5a23980e79990_rand td-pb-border-top td_block_template_1 td-column-1 td_block_padding" data-td-block-uid="td_uid_12_5a23980e79990" > <div class="td-block-title-wrap"></div><div id=td_uid_12_5a23980e79990 class="td_block_inner td-column-1"><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/na-makbuke-ne-rabotaet-zvuk-neispravnye-dinamiki-ili-zvukovoi.html" rel="bookmark" title="Arızalı hoparlörler veya ses yongası"><img width="218" height="150" class="entry-thumb" src="/uploads/ad5f96707940e9f184a61371202f79ae.jpg" alt="Arızalı hoparlörler veya ses yongası" title="Arızalı hoparlörler veya ses yongası"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/na-makbuke-ne-rabotaet-zvuk-neispravnye-dinamiki-ili-zvukovoi.html" rel="bookmark" title="Arızalı hoparlörler veya ses yongası">Arızalı hoparlörler veya ses yongası</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/kak-izmenit-informaciyu-o-kompyutere-mac-os-kak-izmenit-dannye.html" rel="bookmark" title=""Bu Mac Hakkında" bölümündeki donanım verileri nasıl değiştirilir?"><img width="218" height="150" class="entry-thumb" src="/uploads/665819b549c2a30d8142138f773fc066.jpg" alt=""Bu Mac Hakkında" bölümündeki donanım verileri nasıl değiştirilir?" title=""Bu Mac Hakkında" bölümündeki donanım verileri nasıl değiştirilir?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/kak-izmenit-informaciyu-o-kompyutere-mac-os-kak-izmenit-dannye.html" rel="bookmark" title=""Bu Mac Hakkında" bölümündeki donanım verileri nasıl değiştirilir?">"Bu Mac Hakkında" bölümündeki donanım verileri nasıl değiştirilir?</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/imac-ne-vklyuchaetsya-belyi-ekran-ne-zagruzhaetsya-macbook-chto-delat.html" rel="bookmark" title="MacBook açılmıyor: ne yapmalı"><img width="218" height="150" class="entry-thumb" src="/uploads/03274cad0d413ed979a2f92c00deb66d.jpg" alt="MacBook açılmıyor: ne yapmalı" title="MacBook açılmıyor: ne yapmalı"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/imac-ne-vklyuchaetsya-belyi-ekran-ne-zagruzhaetsya-macbook-chto-delat.html" rel="bookmark" title="MacBook açılmıyor: ne yapmalı">MacBook açılmıyor: ne yapmalı</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/aifon-ne-ishchet-set-chto-delat-net-seti-poisk-ili-pochemu-iphone-ne.html" rel="bookmark" title="Şebeke yok, arama yok veya iPhone operatörün SIM kartını neden göremiyor?"><img width="218" height="150" class="entry-thumb" src="/uploads/24bc2d64ff01f453624f1f90639774e8.jpg" alt="Şebeke yok, arama yok veya iPhone operatörün SIM kartını neden göremiyor?" title="Şebeke yok, arama yok veya iPhone operatörün SIM kartını neden göremiyor?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/aifon-ne-ishchet-set-chto-delat-net-seti-poisk-ili-pochemu-iphone-ne.html" rel="bookmark" title="Şebeke yok, arama yok veya iPhone operatörün SIM kartını neden göremiyor?">Şebeke yok, arama yok veya iPhone operatörün SIM kartını neden göremiyor?</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/kak-zamenit-zhestkii-disk-na-makbuke-pro-ustanovka-ssd-i-vtorogo-hdd.html" rel="bookmark" title="Bir SSD ve ikinci bir HDD takma"><img width="218" height="150" class="entry-thumb" src="/uploads/e039ca358bd7d54d5d5c1ee340b39c06.jpg" alt="Bir SSD ve ikinci bir HDD takma" title="Bir SSD ve ikinci bir HDD takma"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/kak-zamenit-zhestkii-disk-na-makbuke-pro-ustanovka-ssd-i-vtorogo-hdd.html" rel="bookmark" title="Bir SSD ve ikinci bir HDD takma">Bir SSD ve ikinci bir HDD takma</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/apple-watch-ne-vklyuchaetsya-ne-vklyuchayutsya-apple-watch-chto-delat-nekotorye.html" rel="bookmark" title="Apple Watch açılmıyor, ne yapmalıyım?"><img width="218" height="150" class="entry-thumb" src="/uploads/c6f7694305a1028eeba24f58a0b38d82.jpg" alt="Apple Watch açılmıyor, ne yapmalıyım?" title="Apple Watch açılmıyor, ne yapmalıyım?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/apple-watch-ne-vklyuchaetsya-ne-vklyuchayutsya-apple-watch-chto-delat-nekotorye.html" rel="bookmark" title="Apple Watch açılmıyor, ne yapmalıyım?">Apple Watch açılmıyor, ne yapmalıyım?</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div> </div> <div class="td-pb-span4"> <div class="td_block_wrap td_block_15 td_block_widget td_uid_13_5a23980e7caa8_rand td-pb-border-top td_block_template_1 td-column-1 td_block_padding" data-td-block-uid="td_uid_13_5a23980e7caa8" > <div class="td-block-title-wrap"></div><div id=td_uid_13_5a23980e7caa8 class="td_block_inner td-column-1"><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/kak-otvyazat-apple-watch-ot-icloud-kak-pravilno-otvyazat-iwatch-ot-apple-id-i-icloud.html" rel="bookmark" title="İWatch ile Apple ID ve iCloud arasındaki bağlantı nasıl doğru şekilde kaldırılır?"><img width="218" height="150" class="entry-thumb" src="/uploads/14e56ba6f791d902aad19bf4a5f020fb.jpg" alt="İWatch ile Apple ID ve iCloud arasındaki bağlantı nasıl doğru şekilde kaldırılır?" title="İWatch ile Apple ID ve iCloud arasındaki bağlantı nasıl doğru şekilde kaldırılır?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/kak-otvyazat-apple-watch-ot-icloud-kak-pravilno-otvyazat-iwatch-ot-apple-id-i-icloud.html" rel="bookmark" title="İWatch ile Apple ID ve iCloud arasındaki bağlantı nasıl doğru şekilde kaldırılır?">İWatch ile Apple ID ve iCloud arasındaki bağlantı nasıl doğru şekilde kaldırılır?</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/pridavili-planshet-vnutri-polosy-chto-delat-esli-na-displee.html" rel="bookmark" title="Tablet ekranında çizgiler veya dalgalanmalar belirirse ne yapmalı?"><img width="218" height="150" class="entry-thumb" src="/uploads/e98bea800fbff9ac4e31eb2f1ae6536a.jpg" alt="Tablet ekranında çizgiler veya dalgalanmalar belirirse ne yapmalı?" title="Tablet ekranında çizgiler veya dalgalanmalar belirirse ne yapmalı?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/pridavili-planshet-vnutri-polosy-chto-delat-esli-na-displee.html" rel="bookmark" title="Tablet ekranında çizgiler veya dalgalanmalar belirirse ne yapmalı?">Tablet ekranında çizgiler veya dalgalanmalar belirirse ne yapmalı?</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/otlozhennyi-start-v-multivarke-kasha-v-multivarke-otlozhennyi-start.html" rel="bookmark" title="Yavaş bir tencerede yulaf lapası (Gecikmeli başlatma)"><img width="218" height="150" class="entry-thumb" src="/uploads/a4ab07364952cfca9d36383d89806556.jpg" alt="Yavaş bir tencerede yulaf lapası (Gecikmeli başlatma)" title="Yavaş bir tencerede yulaf lapası (Gecikmeli başlatma)"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/otlozhennyi-start-v-multivarke-kasha-v-multivarke-otlozhennyi-start.html" rel="bookmark" title="Yavaş bir tencerede yulaf lapası (Gecikmeli başlatma)">Yavaş bir tencerede yulaf lapası (Gecikmeli başlatma)</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/deshifrovat-fail-vashi-faily-byli-zashifrovany-chto-delat.html" rel="bookmark" title="Dosyalarınız şifrelendi - ne yapmalı?"><img width="218" height="150" class="entry-thumb" src="/uploads/bffae52de3b7456d856b6c28691928f8.jpg" alt="Dosyalarınız şifrelendi - ne yapmalı?" title="Dosyalarınız şifrelendi - ne yapmalı?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/deshifrovat-fail-vashi-faily-byli-zashifrovany-chto-delat.html" rel="bookmark" title="Dosyalarınız şifrelendi - ne yapmalı?">Dosyalarınız şifrelendi - ne yapmalı?</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/kak-ubrat-nadpis-ob-aktivacii-cherez-reestr-avtomaticheskaya.html" rel="bookmark" title="Windows'ta üzerine gelindiğinde otomatik pencere aktivasyonu Parametre ayarlarını değiştirerek bildirimleri devre dışı bırakın"><img width="218" height="150" class="entry-thumb" src="/uploads/2af8a44cb6567ba500dbeb10d87a5a6c.jpg" alt="Windows'ta üzerine gelindiğinde otomatik pencere aktivasyonu Parametre ayarlarını değiştirerek bildirimleri devre dışı bırakın" title="Windows'ta üzerine gelindiğinde otomatik pencere aktivasyonu Parametre ayarlarını değiştirerek bildirimleri devre dışı bırakın"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/kak-ubrat-nadpis-ob-aktivacii-cherez-reestr-avtomaticheskaya.html" rel="bookmark" title="Windows'ta üzerine gelindiğinde otomatik pencere aktivasyonu Parametre ayarlarını değiştirerek bildirimleri devre dışı bırakın">Windows'ta üzerine gelindiğinde otomatik pencere aktivasyonu Parametre ayarlarını değiştirerek bildirimleri devre dışı bırakın</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/tr/sozdanie-brauzera-dlya-android-kak-izmenit-brauzer-po-umolchaniyu-v.html" rel="bookmark" title="Android'de varsayılan tarayıcı nasıl değiştirilir"><img width="218" height="150" class="entry-thumb" src="/uploads/ddd2ab8adb97963ee60e95a215a4df0e.jpg" alt="Android'de varsayılan tarayıcı nasıl değiştirilir" title="Android'de varsayılan tarayıcı nasıl değiştirilir"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/tr/sozdanie-brauzera-dlya-android-kak-izmenit-brauzer-po-umolchaniyu-v.html" rel="bookmark" title="Android'de varsayılan tarayıcı nasıl değiştirilir">Android'de varsayılan tarayıcı nasıl değiştirilir</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside> </div> </div> </div> </div> <div class="td-sub-footer-container td-container-wrap "> <div class="td-container"> <div class="td-pb-row"> <div class="td-pb-span td-sub-footer-menu"> </div> <div class="td-pb-span td-sub-footer-copy">Copyright 2021 - Bilgisayar ve Dizüstü Bilgisayar Onarımları. Video kartları, sabit diskler, internet, monitörler.</div> </div> </div> </div> </div> <style type="text/css" media="screen"> /* custom css theme panel */ .td-post-header .entry-title { font-weight: normal !important; } h1.entry-title { font-weight: normal !important; border-bottom:#c44c4c 2px dotted; } h1.entry-title:before { content: "\f184"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .sf-menu ul .td-menu-item > a:hover, .sf-menu ul .sfHover > a, .sf-menu ul .current-menu-ancestor > a, .sf-menu ul .current-category-ancestor > a, .sf-menu ul .current-menu-item > a { color: #edf3f7; } .td-post-content h2 { border-bottom:#c44c4c 2px dotted;} .td-post-content h2:before { content: "\f184"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .td-post-content h3 { border-bottom:#c44c4c 2px dotted;} .td-post-content h3:before { content: "\f103"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .category-my .td-page-title { color:#c44c4c; font-weight: 400; font-size: 36px; } .post header .entry-title { line-height: 40px; } .td-category-description h2, .td-category-description h3 { color:#c44c4c;} .td-category-description h2 { border-bottom:#c44c4c 2px solid;} .td-category-description h2:before { content: "\f055"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .td-category-description h3 { border-bottom:#c44c4c 2px solid;} .td-category-description h3:before { content: "\f103"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .td-category-description ol, .td-category-description ul { margin-top:20px !important; margin-bottom:20px !important;} .td-category-description ul, .td-post-content ul { padding:0; margin:0; list-style:none; clear:both;} .td-category-description ul li, .td-post-content ul li { padding:0 0 0 15px; margin:0 0 10px 35px; position:relative;} .td-category-description ul li:before, .td-post-content ul li:before { content: "\f192"; font-family: "FontAwesome"; color:#c44c4c; position:absolute; left:-10px;} .td-category-description ol, .td-post-content ol { padding:0; margin:0 0 0 5px; list-style:none; counter-reset: lipoint; clear:both;} .td-category-description ol li, .td-post-content ol li { padding:0 0 0 15px; margin:0 0 10px 35px; position:relative;} .td-category-description ol li:before, .td-post-content ol li:before { content: counter(lipoint); counter-increment: lipoint; color:#fff; position:absolute; left:-16px; background:#c44c4c; width:20px; height:20px; line-height:20px; text-align:center; -webkit-border-radius: 20px;border-radius: 20px; font-size:12px; top:3px;} .toc_list li:before { display:none} .td-header-style-9 .td-header-menu-wrap-full { /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#c44c4c+0,c10000+100 */ background: #c44c4c; /* Old browsers */ background: -moz-linear-gradient(top, #c44c4c 0%, #c10000 100%); /* FF3.6-15 */ background: -webkit-linear-gradient(top, #c44c4c 0%,#c10000 100%); /* Chrome10-25,Safari5.1-6 */ background: linear-gradient(to bottom, #c44c4c 0%,#c10000 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c44c4c', endColorstr='#c10000',GradientType=0 ); /* IE6-9 */ } .sf-menu > li > a { color: #fff; } .td-header-style-9 .header-search-wrap .td-icon-search { color: #fff; } .td-affix a { color:#000 !important;} </style> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "smooth_scroll":"1"} ; /* ]]> */ </script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/table-of-contents-plus/front.min.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/wp-postratings/js/postratings-js.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/themes/Newspaper/js/tagdiv_theme.js'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js'></script> <script type='text/javascript'> /* <![CDATA[ */ var boxzilla_options = { "testMode":"","boxes":[]} ; /* ]]> */ </script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/boxzilla/assets/js/script.min.js'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/client/js/prod/lib.core.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/client/js/prod/lib.view.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/themes/baseline/js/prod/client.js'></script> <script type='text/javascript' src='/assets/client1.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/template-tags/item/js/prod/tag.item.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/template-tags/ui/js/prod/tag.ui.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/content-handlers/image/js/prod/handler.image.js'></script> <script> (function(){ var html_jquery_obj = jQuery('html'); if (html_jquery_obj.length && (html_jquery_obj.is('.ie8') || html_jquery_obj.is('.ie9'))) { var path = '/wp-content/themes/Newspaper/style.css'; jQuery.get(path, function(data) { var str_split_separator = '#td_css_split_separator'; var arr_splits = data.split(str_split_separator); var arr_length = arr_splits.length; if (arr_length > 1) { var dir_path = '/wp-content/themes/Newspaper'; var splited_css = ''; for (var i = 0; i < arr_length; i++) { if (i > 0) { arr_splits[i] = str_split_separator + ' ' + arr_splits[i]; } //jQuery('head').append('<style>' + arr_splits[i] + '</style>'); var formated_str = arr_splits[i].replace(/\surl\(\'(?!data\:)/gi, function regex_function(str) { return ' url(\'' + dir_path + '/' + str.replace(/url\(\'/gi, '').replace(/^\s+|\s+$/gm,''); } ); splited_css += "<style>" + formated_str + "</style>"; } var td_theme_css = jQuery('link#td-theme-css'); if (td_theme_css.length) { td_theme_css.after(splited_css); } } } ); } } )(); </script> </body> </html>