Bagaimana cara bekerja dengan dokumen XML di Delphi? Secara khusus, menggunakan TXMLDocument? Menggunakan Model Objek Dokumen XML.

Bagi banyak programmer Delphi, menyimpan pengaturan dikaitkan dengan penggunaan INI file dalam program Anda. Penggunaan metode ini, dalam proyek yang kurang lebih serius, harus dihindari, karena membatasi fleksibilitas, yang mencegah perluasan program lebih lanjut. Patut dikatakan bahwa pendekatan ini cukup populer, karena kemudahan penggunaannya dan keberadaan alat bawaan di lingkungan pengembangan.

Namun, opsi ideal untuk menyimpan pengaturan program adalah terstruktur XML file. Keuntungan mereka adalah bahwa jumlah parameter mungkin tidak tetap. Untuk memahami ini lebih baik, mari kita lihat contoh spesifik.

Dalam program USearch, ketika Anda mengklik entri, menu konteks muncul di mana daftar item ditampilkan. Item ini adalah perintah, yang pada gilirannya diambil dari file pengaturan. Jika pengaturan disimpan di INI file, program dapat menyimpan dan memuat sejumlah instruksi, seperti 10 atau 50. Segera setelah nilai yang lebih besar diperlukan, kode harus ditulis ulang dan dikompilasi ulang.


Mengambil pendekatan menggunakan XML file, kami akan dapat memuat semua parameter bagian secara dinamis. Untuk semua ini, file konfigurasi akan menjadi lebih elegan, tanpa penomoran parameter yang berlebihan. Tetapi, sarana standar bekerja dengan XML di Delphi memiliki banyak kelemahan, jadi saya sarankan menggunakan perpustakaan standar MSXML. Biasanya disertakan secara default sistem operasi Keluarga jendela.


Untuk menghubungkan MSXML, kita perlu membuat file antarmuka dengan daftar semua fungsi dengan mengimpornya dari server COM. Cara mengimpor antarmuka, beberapa artikel terperinci telah ditulis, tetapi saya sarankan Anda mengunduh file MSXML2_TLB.PAS sudah siap digunakan. Setelah file diunduh, letakkan di sebelah proyek Anda, atau letakkan di folder lib lingkungan Delphi. Dengan demikian, semua program yang dibuat akan dapat menggunakan modul MSXML, Anda hanya perlu menambahkan baris MSXML2_TLB untuk menggunakan .

Untuk kejelasan, pertimbangkan contoh berikut menggunakan perpustakaan ini:

LoadProcedureData; var XMLDoc: DOMDocument; Akar: IXMLDOMElement; mulai XMLDoc:= CoDOMDocument.Create; XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("ukuran/lebar").Teks); Akar:= nihil; XMLDoc:= nihil; akhir;

Pertama, sebuah instance dari kelas DOMDocument dibuat, dan kemudian konten dari file settings.xml dimuat ke dalam memori. Karena menurut standar any XML file harus berisi tag root (dalam kasus ini konfigurasi), maka kita perlu mendapatkannya menggunakan fungsi Elemen Dokumen. Kemudian konten di antara tag ditampilkan , yang pada gilirannya berada di antara tag . Jadi, dari file settings.xml, metode kami akan menampilkan teks di MessageBox "100 piksel".

500px 100px

Di sini metode SelectSingleNode digunakan, yang mengambil string sebagai parameter

Terlepas dari kenyataan bahwa topik bekerja dengan XML di Delphi telah dibahas secara luas di Internet, pertanyaan tentang topik ini sering muncul di semua jenis forum.

Saya sudah memposting ini juga, tetapi saya ingin kembali ke kasus nyata dengan cepat mengurai file XML dan mengekstraksi data, yang saya lakukan di tempat kerja hari ini. Butuh waktu tidak lebih dari 5 menit untuk mendapatkan data yang diperlukan.

Latar belakang. Hari ini perlu untuk memproses data pada program yang diinstal di komputer pengguna (ya, ya, kami mendeteksi bajak laut :)). Departemen teknis memberi saya informasi yang diambil dari pengguna yang tidak curiga melalui jaringan menggunakan WMI. Program yang mereka gunakan menghasilkan laporan dalam format XML. Oleh karena itu, mereka membawakan saya segunung file XML dengan struktur yang agak rumit, dari mana saya hanya perlu mengekstrak nama produk perangkat lunak yang diinstal.

Perlakuan . Setelah meninjau beberapa file secara manual, saya menyadari bahwa tidak akan lama untuk menjadi tua, dan memutuskan untuk menulis konverter kecil. Meluncurkan Delphi, saya memilih objek XML DataBinding di repositori dan memasukkannya ke salah satu file. Saya meninggalkan semua pengaturan dan parameter secara default, dan sebagai hasilnya, saya membentuk modul dengan jumlah besar kelas dan antarmuka untuk mengakses elemen file XML ini. Saya tidak mulai berurusan dengan struktur kelas untuk waktu yang lama, saya segera mulai menulis konverter.

Dalam aplikasi konsol baru, saya menulis kode yang cukup sederhana:


program XML2TXT;

menggunakan
formulir,
Kelas, SysUtils,
SoftwareXML di "SoftwareXML.pas";

prosedur CovertXML2Text;
var
basis lunak: IXMLSTDSSoftwareType;
saya: bilangan bulat;
sr: TSearchRec;
CurDir:string;
EksporFile: TStringList;
mulai
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
jika FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0 maka
mengulang
ExportFile:= TStringList.Create;
softbase:= LoadSTDSoftware(Pchar(CurDir+sr.Name));
untuk i:= 0 hingga softbase.InstalledSoftware.source.software.Count - 1 do
ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);
EksporFile.Urutkan;
ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+".txt");
EksporFile.Gratis;
sampai FindNext(sr) 0;
akhir;

mulai
Aplikasi.Inisialisasi;
TerselubungXML2Teks;
akhir.

Akibatnya, saya mendapat satu buku teks untuk setiap komputer di grid, yang berisi daftar perangkat lunak yang diinstal.

Saya merasa bahwa kode ini akan memerlukan penjelasan. Misalnya, mengapa saya menggunakan modul Formulir di aplikasi konsol dan memanggil prosedur Application.Initialize;?

Faktanya, semuanya sederhana - ini adalah peretasan kecil yang memungkinkan Anda menggunakan XML Data Binding di aplikasi konsol. Karena keras kepala menolak untuk menginisialisasi kelas untuk bekerja dengan XML. Saya belum menemukan alasan sebenarnya - waktu hari ini penting, jadi saya menghabiskan 4 dari 5 menit untuk melawan kesalahan ini. :) Saya pikir nanti untuk menangani masalah ini dan menulis apa alasan sebenarnya.

Kelas softbase aneh dibuat berdasarkan file XML - yang merupakan nama elemen root, dan softbase.InstalledSoftware.source.software[i].DisplayName - hanya menavigasi elemen bersarang ke elemen yang diinginkan dan mendapatkan nilainya.

Ini adalah salah satu yang paling terlihat. cara cepat bekerja dengan XML di Delphi.

XML semakin banyak digunakan untuk menyimpan informasi dan menukarnya antara aplikasi dan situs Web. Dalam banyak aplikasi, bahasa ini digunakan sebagai bahasa dasar untuk menyimpan data, di lain pihak - untuk mengekspor dan mengimpor data XML. Oleh karena itu, inilah saatnya bagi pengembang untuk memikirkan bagaimana data XML dapat digunakan dalam aplikasi mereka sendiri.

Pada artikel ini, kita akan melihat XML Document Object Model (DOM) dan implementasi Microsoft, Microsoft XML DOM.

XML DOM adalah model objek yang menyediakan objek bagi pengembang untuk memuat dan memanipulasi file XML. Model objek terdiri dari objek utama berikut: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap, dan XMLDOMParseError. Setiap objek ini (kecuali XMLDOMParseError) berisi properti dan metode yang memungkinkan Anda mendapatkan informasi tentang objek, memanipulasi nilai dan struktur objek, dan menavigasi struktur dokumen XML.

Mari kita lihat objek XML DOM utama dan berikan beberapa contoh penggunaannya di Borland Delphi.

Menggunakan XML DOM di Borland Delphi

Untuk menggunakan Microsoft XML DOM di aplikasi Delphi, Anda harus menyertakan pustaka jenis yang sesuai di proyek Anda. Untuk melakukan ini, kami menjalankan perintah Proyek | Import Type Library dan di kotak dialog Import Type Library, pilih perpustakaan Microsoft XML versi 2.0 (Versi 2.0), yang biasanya terletak di file Windows\System\MSXML.DLL

Setelah mengklik tombol Buat Unit, modul antarmuka MSXML_TLB akan dibuat, yang memungkinkan kita untuk menggunakan objek XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest dan sejumlah lainnya yang diimplementasikan di perpustakaan MSXML.DLL. Referensi ke modul MSXML_TLB harus ditentukan dalam daftar Penggunaan.

Perangkat XML DOM

Model Objek Dokumen mewakili dokumen XML sebagai struktur pohon yang terdiri dari cabang. XML DOM API memungkinkan aplikasi melintasi pohon dokumen dan memanipulasi cabangnya. Setiap cabang dapat memiliki tipe tertentu (DOMNodeType), yang dengannya cabang induk dan anak didefinisikan. Di sebagian besar dokumen XML, Anda akan menemukan cabang elemen, atribut, dan teks. Atribut adalah jenis cabang khusus dan bukan cabang anak. Atribut dikelola. metode khusus, disediakan oleh objek XML DOM.

Selain mengimplementasikan antarmuka yang direkomendasikan World Wide Web Consortium (W3C), Microsoft XML DOM berisi metode yang mendukung XSL, XSL Patterns, Namespaces, dan tipe data. Misalnya, metode SelectNodes memungkinkan Anda menggunakan Sintaks Pola XSL untuk menemukan cabang dalam konteks tertentu, dan metode TransformNode mendukung penggunaan XSL untuk melakukan transformasi.

Uji Dokumen XML

Sebagai contoh dokumen XML, mari kita ambil direktori CD-ROM musik, yang memiliki struktur berikut:

Empire Burlesque Bob Dylan Amerika Serikat Kolumbia 10.90 1985 sembunyikan hatimu Bonnie Tylor Inggris Catatan CBS 9.90 1988 ... Lepaskan hati saya Joe Cocker Amerika Serikat EMI 8.20 1987

Sekarang kita siap untuk mulai melihat model objek XML DOM, yang akan kita mulai dengan objek XMLDOMDocument.

Dokumen XML - objek XMLDOMDocument

Bekerja dengan dokumen XML dimulai dengan memuatnya. Untuk melakukan ini, kami menggunakan metode Load, yang hanya memiliki satu parameter, yang menentukan URL dokumen yang akan dimuat. Saat memuat file dari disk lokal, hanya nama file lengkap yang ditentukan (protokol file:/// dapat dihilangkan dalam kasus ini). Jika dokumen XML disimpan sebagai string, Anda harus menggunakan metode LoadXML untuk memuat dokumen.

Untuk mengontrol bagaimana dokumen dimuat (sinkron atau asinkron), gunakan properti Async. Secara default, properti ini disetel ke True untuk menunjukkan bahwa dokumen dimuat secara asinkron dan kontrol dikembalikan ke aplikasi sebelum dokumen dimuat sepenuhnya. Jika tidak, dokumen dimuat secara serempak, dan kemudian Anda harus memeriksa nilai properti ReadyState untuk melihat apakah dokumen telah dimuat atau belum. Anda juga dapat membuat event handler untuk event OnReadyStateChange yang akan menerima kontrol saat nilai properti ReadyState berubah.

Berikut ini menunjukkan cara memuat dokumen XML menggunakan metode Load:

Menggunakan ... MSXML_TLB ... procedure TForm1.Button1Click(Pengirim: TObject); var XMLDoc: IXMLDOMDocument; mulai XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Salah; XMLDoc.Load('C:\DATA\DATA.xml'); // // Berikut adalah kode yang memanipulasi // dokumen XML dan cabangnya // XMLDoc:= Nil; akhir;

Setelah dokumen dimuat, kita dapat mengakses propertinya. Misalnya, properti NodeName akan berisi nilai #document, properti NodeTypeString akan berisi dokumen nilai, dan properti URL akan berisi file nilai:///C:/DATA/DATA.xml.

Penanganan Kesalahan

Yang menarik adalah properti yang terkait dengan pemrosesan dokumen saat dimuat. Misalnya, properti ParseError mengembalikan objek XMLDOMParseError yang berisi informasi tentang kesalahan yang terjadi saat memproses dokumen.

Untuk menulis penangan kesalahan, Anda dapat menambahkan kode berikut:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; Jika XMLError.ErrorCode<>0 Kemudian // // Di sini kita menangani kesalahan // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nihil;

Untuk mengetahui informasi apa yang dikembalikan jika terjadi kesalahan, ubah entri direktori berikut:

Empire Burlesque Bob Dylan Amerika Serikat Kolumbia 10.90 1985

hapus elemen penutup di baris kedua:</p><p> <CD> <TITLE>Empire Burlesque <ARTIST>Bob Dylan</ARTIST> <COUNTRY>Amerika Serikat</COUNTRY> <COMPANY>Kolumbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Sekarang mari kita tulis kode yang mengembalikan nilai properti dari objek XMLDOMParseError:</p><p>XMLError:= XMLDoc.ParseError; Jika XMLError.ErrorCode<>0 Kemudian Dengan XMLError, Memo1.Lines memulai Add('File:' + URL); Add('Kode:' + IntToStr(Kode Kesalahan)); Add('Kesalahan:' + Alasan); Add('Teks:' + SrcTeks); Add('Baris: ' + IntToStr(Baris)); Add('Posisi:' + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); akhir;</p><p>dan jalankan aplikasi kita. Akibatnya, kami mendapatkan informasi kesalahan berikut.</p> <p>Seperti yang Anda lihat dari contoh di atas, informasi yang dikembalikan oleh objek XMLDOMParseError cukup untuk menemukan kesalahan dan memahami alasan kemunculannya.</p> <p>Sekarang mari kita kembalikan elemen penutup <TITLE>dalam dokumen kami dan lanjutkan diskusi kami tentang XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Mengakses pohon dokumen</h2> <p>Untuk mengakses pohon dokumen, Anda bisa mendapatkan elemen root dan kemudian beralih melalui cabang anaknya, atau menemukan beberapa cabang tertentu. Dalam kasus pertama, kita mendapatkan elemen root melalui properti DocumentElement, yang mengembalikan objek bertipe XMLDOMNode. Berikut ini menunjukkan cara menggunakan properti DocumentElement untuk mendapatkan konten setiap elemen turunan:</p><p>VarNode: IXMLDOMNode; Akar: IXMLDOMElement; saya: bilangan bulat; ... Root:= XMLDoc.DocumentElement; Untuk I:= 0 hingga Root.ChildNodes.Length-1 lakukan Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Teks); akhir;</p><p>Untuk dokumen XML kami, kami akan mendapatkan teks berikut.</p> <p>Jika kita tertarik pada cabang tertentu, atau cabang di bawah cabang anak pertama, kita dapat menggunakan metode NodeFromID atau metode GetElementByTagName dari objek XMLDOMDocument.</p> <p>Metode NodeFromID memerlukan pengidentifikasi unik yang ditentukan dalam Skema XML atau Definisi Jenis Dokumen (DTD) dan mengembalikan cabang dengan pengidentifikasi tersebut.</p> <p>Metode GetElementByTagName membutuhkan string dengan elemen tertentu (tag) dan mengembalikan semua cabang dengan elemen ini. Berikut ini menunjukkan cara menggunakan metode ini untuk menemukan semua artis di direktori CD-ROM kami:</p><p>Node: IXMLDOMNodeList; Simpul: IXMLDOMNode; ... Nodes:= XMLDoc.GetElementsByTagName('ARTIST'); Untuk I:= 0 hingga Nodes.Length-1 lakukan Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Teks); akhir;</p><p>Untuk dokumen XML kami, kami akan mendapatkan teks berikut:</p> <p>Perhatikan bahwa metode SelectNodes dari objek XMLDOMNode menyediakan cara yang lebih fleksibel untuk mengakses cabang dokumen. Tetapi lebih lanjut tentang itu di bawah ini.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Cabang dokumen - objek XMLDOMNode</h2> <p>Objek XMLDOMNode mewakili cabang dokumen. Kami telah menemukan objek ini ketika kami mendapatkan elemen root dokumen:</p><p>Root:= XMLDoc.DocumentElement;</p><p>Untuk mendapatkan informasi tentang cabang dokumen XML, Anda dapat menggunakan properti objek XMLDOMNode (Tabel 1).</p> <p>Untuk mengakses data yang disimpan di cabang, seseorang biasanya menggunakan properti NodeValue (tersedia untuk atribut, cabang teks, komentar, instruksi pemrosesan, dan bagian CDATA), properti Teks, yang mengembalikan konten teks cabang, atau properti NodeTypedValue . Yang terakhir, bagaimanapun, hanya dapat digunakan untuk cabang dengan elemen yang diketik.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Menavigasi pohon dokumen</h3> <p>Objek XMLDOMNode menyediakan banyak cara untuk menavigasi pohon dokumen. Misalnya, cabang induk diakses melalui properti ParentNode (tipe XMLDOMNode), cabang anak diakses melalui properti ChildNodes (tipe XMLDOMNodeList), FirstChild dan LastChild (tipe XMLDOMNode), dan seterusnya. Properti OwnerDocument mengembalikan objek bertipe XMLDOMDocument yang mengidentifikasi dokumen XML itu sendiri. Properti yang tercantum di atas memudahkan untuk menavigasi pohon dokumen.</p> <p>Sekarang mari kita ulangi semua cabang dokumen XML:</p><p>Root:= XMLDoc.DocumentElement; Untuk I:= 0 hingga Root.ChildNodes.Length-1 lakukan Begin Node:= Root.ChildNodes.Item[I]; Jika Node.HasChildNodes Kemudian GetChilds(Node,0); akhir;</p><p>Seperti disebutkan di atas, SelectNodes dari objek XMLDOMNode menyediakan cara yang lebih fleksibel untuk mengakses cabang dokumen. Selain itu, ada metode SelectSingleNode yang hanya mengembalikan cabang pertama dari dokumen. Kedua metode ini memungkinkan Anda menentukan templat XSL untuk menemukan cabang.</p> <p>Pertimbangkan proses penggunaan metode SelectNodes untuk mengambil semua cabang yang memiliki cabang CD dan sub-cabang PRICE:</p><p>Root:= XMLDoc.DocumentElement; Node:= Root.SelectNodes('CD/PRICE');</p><p>Semua sub-cabang PRICE dari cabang CD akan ditempatkan di koleksi Nodes. Kami akan kembali ke pembahasan template XSL nanti.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulasi cabang anak</h3> <p>Untuk memanipulasi cabang anak, kita dapat menggunakan metode objek XMLDOMNode (Tabel 2).</p> <p>Untuk menghapus entri tentang disk pertama sepenuhnya, Anda harus menjalankan kode berikut:</p><p>Var XMLDoc: IXMLDOMDocument; Akar: IXMLDOMNode; Simpul: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Salah; XMLDoc.Load('C:\DATA\DATA.xml'); // Dapatkan elemen root Root:= XMLDoc.DocumentElement; Simpul:= Akar; // Hapus cabang anak pertama Node.RemoveChild(Node.FirstChild);</p><p>Perhatikan bahwa dalam contoh ini kami menghapus cabang anak pertama. Cara menghapus elemen pertama dari cabang anak pertama ditunjukkan di bawah ini:</p><p>Var XMLDoc: IXMLDOMDocument; Akar: IXMLDOMNode; Simpul: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Salah; XMLDoc.Load('C:\DATA\DATA.xml'); // Dapatkan elemen root Root:= XMLDoc.DocumentElement; // dan cabang anak pertama Node:= Root.FirstChild; // Hapus cabang anak pertama Node.RemoveChild(Node.FirstChild);</p><p>Dalam contoh di atas, kami belum menghapus cabang pertama <CD>…</CD>, dan elemen pertama dari cabang adalah <TITLE>….

Sekarang mari kita tambahkan cabang baru. Di bawah ini adalah kode yang menunjukkan cara menambahkan entri CD-ROM musik baru:

Var Node Baru: IXMLDOMNode; Anak: IXMLDOMNode; ... // Buat cabang baru - Node Baru:= XMLDoc.CreateNode(1, 'CD', ''); // Tambahkan elemen Anak:= XMLDoc.CreateNode(1,'TITLE',''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= 'Pink Floyd'; // Tambahkan elemen <ARTIST>Anak:= XMLDoc.CreateNode(1, 'ARTIST', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= 'Division Bell'; // Tambahkan elemen <COUNTRY>Anak:= XMLDoc.CreateNode(1, 'NEGARA', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= 'UK'; // Tambahkan elemen <COMPANY>Anak:= XMLDoc.CreateNode(1, 'PERUSAHAAN', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= 'EMI Records Ltd.'; // Tambahkan elemen <PRICE>Anak:= XMLDoc.CreateNode(1, 'PRICE', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= '11.99"; // Tambahkan elemen <YEAR>Anak:= XMLDoc.CreateNode(1, 'TAHUN', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= '1994'; // Dan tambahkan cabang Root.AppendChild(NewNode); ...</p><p>Kode di atas menunjukkan urutan langkah-langkah berikut untuk menambahkan cabang baru:</p> <ul><li>Membuat cabang baru menggunakan metode CreateNode: <ul><li>membuat elemen menggunakan metode CreateNode;</li> <li>menambahkan elemen ke cabang menggunakan metode AppendChild;</li> <li>mengatur nilai elemen melalui properti Text;</li> <li>... ulangi untuk semua elemen.</li> </ul></li> <li>Menambahkan cabang baru ke dokumen menggunakan metode AppendChild.</li> </ul><p>Ingatlah bahwa metode AppendChild menambahkan cabang ke ujung pohon. Untuk menambahkan cabang ke lokasi tertentu di pohon, Anda harus menggunakan metode InsertBefore.</p> <h2>Set cabang - objek XMLDOMNodeList</h2> <p>Objek XMLNodeList berisi daftar cabang, yang dapat dibangun menggunakan metode SelectNodes atau GetElementsByTagName, atau diambil dari properti ChildNodes.</p> <p>Kita telah melihat penggunaan objek ini dalam contoh yang diberikan di bagian "Menavigasi Pohon Dokumen". Di sini kami menyajikan beberapa pernyataan teoretis.</p> <p>Jumlah cabang dalam daftar dapat diperoleh sebagai nilai dari properti Panjang. Cabang-cabang memiliki indeks dari 0 hingga Panjang-1, dan setiap cabang individu dapat diakses melalui elemen array Item dengan indeks yang sesuai.</p> <p>Memindahkan daftar cabang juga dapat dilakukan dengan menggunakan metode NextNode, yang mengembalikan cabang berikutnya dalam daftar, atau Nil jika cabang saat ini adalah yang terakhir. Untuk kembali ke awal daftar, panggil metode Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Buat dan simpan dokumen</h2> <p>Jadi, kita telah melihat bagaimana Anda dapat menambahkan cabang dan elemen ke dokumen XML yang ada. Sekarang mari kita membuat dokumen XML dengan cepat. Pertama-tama, ingatlah bahwa dokumen dapat dimuat tidak hanya dari URL, tetapi juga dari string biasa. Berikut ini menunjukkan cara membuat elemen root, yang kemudian dapat digunakan untuk membangun elemen lainnya secara dinamis (yang telah kita bahas dalam Memanipulasi Cabang Anak):</p><p>Var XMLDoc: IXMLDOMDocument; Akar: IXMLDOMNode; Simpul: IXMLDOMNode; S: Tali Lebar; ...S:=' <CATALOG></CATALOG>'; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Salah; XMLDoc.LoadXML(S); Root:= XMLDoc.DocumentElement; Node:= XMLDoc.CreateNode(1, 'CD', ''); Root.AppendChild(Node); Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nihil;</p><p>Setelah membangun dokumen XML, kami menyimpannya ke file menggunakan metode Save. Sebagai contoh:</p> <p>XMLDoc.Save('C:\DATA\NEWCD.XML');</p> <p>Selain menyimpan ke file, metode Simpan memungkinkan Anda untuk menyimpan dokumen XML ke objek XMLDOMDocument baru. Dalam hal ini, dokumen diproses sepenuhnya dan, sebagai hasilnya, struktur dan sintaksnya diperiksa. Berikut ini menunjukkan cara menyimpan dokumen di objek lain:</p><p>Prosedur TForm1.Button2Click(Pengirim: TObject); var XMLDoc2: IXMLDOMDocument; mulai XMLDoc2:= CoDOMDocument.Create; XMLDoc.Simpan(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nihil; akhir;</p><p>Terakhir, metode Simpan juga memungkinkan Anda untuk menyimpan dokumen XML ke objek COM lain yang mendukung antarmuka IStream, IPersistStream, atau IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Menggunakan Template XSL</h2> <p>Saat membahas metode SelectNodes dari objek XMLDOMNode, kami menyebutkan bahwa metode ini menyediakan cara yang lebih fleksibel untuk mengakses cabang dokumen. Fleksibilitasnya adalah Anda dapat menentukan template XSL sebagai kriteria untuk memilih cabang. Template tersebut menyediakan mekanisme yang kuat untuk menemukan informasi dalam dokumen XML. Misalnya, untuk mendapatkan daftar semua judul CD-ROM musik di katalog kami, kami dapat menjalankan kueri berikut:</p><p>Untuk mengetahui CD artis mana yang dirilis di AS, kueri dibentuk sebagai berikut:</p><p>Node:= Root.SelectNodes('CD/ARTIST');</p><p>Berikut ini menunjukkan cara menemukan drive pertama di direktori:</p><p>Node:= Root.SelectNodes('CD/TITLE');</p><p>Dan terakhir:</p><p>Node:= Root.SelectNodes('CD/TITLE');</p><p>Untuk menemukan disk Bob Dylan, Anda dapat menjalankan kueri berikut:</p><p>Node:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');</p><p>dan untuk mendapatkan daftar disk yang dirilis setelah 1985, kami menjalankan kueri berikut:</p><p>Node:= Root.SelectNodes('CD/TITLE');</p><p>Diskusi yang lebih rinci tentang sintaks XSL memerlukan posting terpisah. Untuk menggugah pembaca dan mendorong penelitian lebih lanjut, saya hanya akan memberikan satu contoh kecil tentang kemungkinan penggunaan XSL. Katakanlah kita perlu mengubah direktori kita menjadi tabel HTML biasa. Menggunakan metode tradisional, kita harus melewati semua cabang pohon dan membentuk tag yang sesuai untuk setiap elemen yang diterima. <TD>…</TD>.</p> <p>Menggunakan XSL, kita cukup membuat template (atau style sheet) di mana kita menentukan apa dan bagaimana mengubahnya. Kemudian kami menerapkan templat ini pada katalog kami - dan Anda selesai: kami memiliki teks templat XSL yang mengubah katalog menjadi tabel (Daftar 2).</p> <p>Kode untuk overlay template XSL pada direktori kami terlihat seperti ini:</p><p>Prosedur TForm1.Button2Click(Pengirim: TObject); var XSLdoc: IXMLDOMDocument; mulai XSLdoc:= CoDOMDocument.Create; XSLdoc.Load('C:\DATA\DATA.xsl'); Memo2.Teks:= XMLDoc.TransformNode(XSLDoc); XSLdoc:= Nihil; akhir;</p><p>Mengakhiri diskusi kita tentang XSL, harus dikatakan bahwa saat ini bahasa ini secara aktif digunakan untuk transformasi antara dokumen XML yang berbeda, serta untuk pemformatan dokumen.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Kesimpulan</h2> <p>Untuk alasan yang jelas, tidak mungkin untuk menutupi semua objek Microsoft XML DOM dan memberikan contoh penggunaannya dalam satu artikel. Di sini kita hanya menyentuh masalah utama penggunaan XML DOM dalam aplikasi. Di meja. Gambar 3 menunjukkan semua objek yang diimplementasikan dalam Microsoft XML DOM.</p> <p>KomputerTekan 12"2000</p> <p>XML semakin banyak digunakan untuk menyimpan informasi dan menukarnya antara aplikasi dan situs Web. Dalam banyak aplikasi, bahasa ini digunakan sebagai bahasa dasar untuk menyimpan data, di lain pihak - untuk mengekspor dan mengimpor data XML. Oleh karena itu, inilah saatnya bagi pengembang untuk memikirkan bagaimana data XML dapat digunakan dalam aplikasi mereka sendiri.</p> <p>Pada artikel ini, kita akan melihat XML Document Object Model (DOM) dan implementasi Microsoft, Microsoft XML DOM.</p> <p>XML DOM adalah model objek yang menyediakan objek bagi pengembang untuk memuat dan memanipulasi file XML. Model objek terdiri dari objek utama berikut: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap, dan XMLDOMParseError. Setiap objek ini (kecuali XMLDOMParseError) berisi properti dan metode yang memungkinkan Anda mendapatkan informasi tentang objek, memanipulasi nilai dan struktur objek, dan menavigasi struktur dokumen XML.</p> <p>Mari kita lihat objek XML DOM utama dan berikan beberapa contoh penggunaannya di Borland Delphi.</p> <h2>Menggunakan XML DOM di Borland Delphi</h2> <p>Untuk menggunakan Microsoft XML DOM di aplikasi Delphi, Anda harus menyertakan pustaka jenis yang sesuai di proyek Anda. Untuk melakukan ini, kami menjalankan perintah Proyek | Import Type Library dan di kotak dialog Import Type Library, pilih perpustakaan Microsoft XML versi 2.0 (Versi 2.0), yang biasanya terletak di file Windows\System\MSXML.DLL</p> <p>Setelah mengklik tombol Buat Unit, modul antarmuka MSXML_TLB akan dibuat, yang memungkinkan kita untuk menggunakan objek XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest dan sejumlah lainnya yang diimplementasikan di perpustakaan MSXML.DLL. Referensi ke modul MSXML_TLB harus ditentukan dalam daftar Penggunaan.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Perangkat XML DOM</h2> <p>Model Objek Dokumen mewakili dokumen XML sebagai struktur pohon yang terdiri dari cabang. XML DOM API memungkinkan aplikasi melintasi pohon dokumen dan memanipulasi cabangnya. Setiap cabang dapat memiliki tipe tertentu (DOMNodeType), yang dengannya cabang induk dan anak didefinisikan. Di sebagian besar dokumen XML, Anda akan menemukan cabang elemen, atribut, dan teks. Atribut adalah jenis cabang khusus dan bukan cabang anak. Atribut dimanipulasi menggunakan metode khusus yang disediakan oleh objek XML DOM.</p> <p>Selain mengimplementasikan antarmuka yang direkomendasikan World Wide Web Consortium (W3C), Microsoft XML DOM berisi metode yang mendukung XSL, XSL Patterns, Namespaces, dan tipe data. Misalnya, metode SelectNodes memungkinkan Anda menggunakan Sintaks Pola XSL untuk menemukan cabang dalam konteks tertentu, dan metode TransformNode mendukung penggunaan XSL untuk melakukan transformasi.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Uji Dokumen XML</h2> <p>Sebagai contoh dokumen XML, mari kita ambil direktori CD-ROM musik, yang memiliki struktur berikut:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>Empire Burlesque Bob Dylan Amerika Serikat Kolumbia 10.90 1985 sembunyikan hatimu Bonnie Tylor Inggris Catatan CBS 9.90 1988 ... Lepaskan hati saya Joe Cocker Amerika Serikat EMI 8.20 1987

Sekarang kita siap untuk mulai melihat model objek XML DOM, yang akan kita mulai dengan objek XMLDOMDocument.

Dokumen XML - objek XMLDOMDocument

Bekerja dengan dokumen XML dimulai dengan memuatnya. Untuk melakukan ini, kami menggunakan metode Load, yang hanya memiliki satu parameter, yang menentukan URL dokumen yang akan dimuat. Saat memuat file dari disk lokal, hanya nama file lengkap yang ditentukan (protokol file:/// dapat dihilangkan dalam kasus ini). Jika dokumen XML disimpan sebagai string, Anda harus menggunakan metode LoadXML untuk memuat dokumen.

Untuk mengontrol bagaimana dokumen dimuat (sinkron atau asinkron), gunakan properti Async. Secara default, properti ini disetel ke True untuk menunjukkan bahwa dokumen dimuat secara asinkron dan kontrol dikembalikan ke aplikasi sebelum dokumen dimuat sepenuhnya. Jika tidak, dokumen dimuat secara serempak, dan kemudian Anda harus memeriksa nilai properti ReadyState untuk melihat apakah dokumen telah dimuat atau belum. Anda juga dapat membuat event handler untuk event OnReadyStateChange yang akan menerima kontrol saat nilai properti ReadyState berubah.

Berikut ini menunjukkan cara memuat dokumen XML menggunakan metode Load:

Menggunakan ... MSXML_TLB ... procedure TForm1.Button1Click(Pengirim: TObject); var XMLDoc: IXMLDOMDocument; mulai XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Salah; XMLDoc.Load('C:\DATA\DATA.xml'); // // Berikut adalah kode yang memanipulasi // dokumen XML dan cabangnya // XMLDoc:= Nil; akhir;

Setelah dokumen dimuat, kita dapat mengakses propertinya. Misalnya, properti NodeName akan berisi nilai #document, properti NodeTypeString akan berisi dokumen nilai, dan properti URL akan berisi file nilai:///C:/DATA/DATA.xml.

Penanganan Kesalahan

Yang menarik adalah properti yang terkait dengan pemrosesan dokumen saat dimuat. Misalnya, properti ParseError mengembalikan objek XMLDOMParseError yang berisi informasi tentang kesalahan yang terjadi saat memproses dokumen.

Untuk menulis penangan kesalahan, Anda dapat menambahkan kode berikut:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; Jika XMLError.ErrorCode<>0 Kemudian // // Di sini kita menangani kesalahan // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nihil;

Untuk mengetahui informasi apa yang dikembalikan jika terjadi kesalahan, ubah entri direktori berikut:

Empire Burlesque Bob Dylan Amerika Serikat Kolumbia 10.90 1985

hapus elemen penutup di baris kedua:</p><p> <CD> <TITLE>Empire Burlesque <ARTIST>Bob Dylan</ARTIST> <COUNTRY>Amerika Serikat</COUNTRY> <COMPANY>Kolumbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Sekarang mari kita tulis kode yang mengembalikan nilai properti dari objek XMLDOMParseError:</p><p>XMLError:= XMLDoc.ParseError; Jika XMLError.ErrorCode<>0 Kemudian Dengan XMLError, Memo1.Lines memulai Add('File:' + URL); Add('Kode:' + IntToStr(Kode Kesalahan)); Add('Kesalahan:' + Alasan); Add('Teks:' + SrcTeks); Add('Baris: ' + IntToStr(Baris)); Add('Posisi:' + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); akhir;</p><p>dan jalankan aplikasi kita. Akibatnya, kami mendapatkan informasi kesalahan berikut.</p> <p>Seperti yang Anda lihat dari contoh di atas, informasi yang dikembalikan oleh objek XMLDOMParseError cukup untuk menemukan kesalahan dan memahami alasan kemunculannya.</p> <p>Sekarang mari kita kembalikan elemen penutup <TITLE>dalam dokumen kami dan lanjutkan diskusi kami tentang XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Mengakses pohon dokumen</h2> <p>Untuk mengakses pohon dokumen, Anda bisa mendapatkan elemen root dan kemudian beralih melalui cabang anaknya, atau menemukan beberapa cabang tertentu. Dalam kasus pertama, kita mendapatkan elemen root melalui properti DocumentElement, yang mengembalikan objek bertipe XMLDOMNode. Berikut ini menunjukkan cara menggunakan properti DocumentElement untuk mendapatkan konten setiap elemen turunan:</p><p>VarNode: IXMLDOMNode; Akar: IXMLDOMElement; saya: bilangan bulat; ... Root:= XMLDoc.DocumentElement; Untuk I:= 0 hingga Root.ChildNodes.Length-1 lakukan Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Teks); akhir;</p><p>Untuk dokumen XML kami, kami akan mendapatkan teks berikut.</p> <p>Jika kita tertarik pada cabang tertentu, atau cabang di bawah cabang anak pertama, kita dapat menggunakan metode NodeFromID atau metode GetElementByTagName dari objek XMLDOMDocument.</p> <p>Metode NodeFromID memerlukan pengidentifikasi unik yang ditentukan dalam Skema XML atau Definisi Jenis Dokumen (DTD) dan mengembalikan cabang dengan pengidentifikasi tersebut.</p> <p>Metode GetElementByTagName membutuhkan string dengan elemen tertentu (tag) dan mengembalikan semua cabang dengan elemen ini. Berikut ini menunjukkan cara menggunakan metode ini untuk menemukan semua artis di direktori CD-ROM kami:</p><p>Node: IXMLDOMNodeList; Simpul: IXMLDOMNode; ... Nodes:= XMLDoc.GetElementsByTagName('ARTIST'); Untuk I:= 0 hingga Nodes.Length-1 lakukan Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Teks); akhir;</p><p>Untuk dokumen XML kami, kami akan mendapatkan teks berikut:</p> <p>Perhatikan bahwa metode SelectNodes dari objek XMLDOMNode menyediakan cara yang lebih fleksibel untuk mengakses cabang dokumen. Tetapi lebih lanjut tentang itu di bawah ini.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Cabang dokumen - objek XMLDOMNode</h2> <p>Objek XMLDOMNode mewakili cabang dokumen. Kami telah menemukan objek ini ketika kami mendapatkan elemen root dokumen:</p><p>Root:= XMLDoc.DocumentElement;</p><p>Untuk mendapatkan informasi tentang cabang dokumen XML, Anda dapat menggunakan properti objek XMLDOMNode (Tabel 1).</p> <p>Untuk mengakses data yang disimpan di cabang, seseorang biasanya menggunakan properti NodeValue (tersedia untuk atribut, cabang teks, komentar, instruksi pemrosesan, dan bagian CDATA), properti Teks, yang mengembalikan konten teks cabang, atau properti NodeTypedValue . Yang terakhir, bagaimanapun, hanya dapat digunakan untuk cabang dengan elemen yang diketik.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Menavigasi pohon dokumen</h3> <p>Objek XMLDOMNode menyediakan banyak cara untuk menavigasi pohon dokumen. Misalnya, cabang induk diakses melalui properti ParentNode (tipe XMLDOMNode), cabang anak diakses melalui properti ChildNodes (tipe XMLDOMNodeList), FirstChild dan LastChild (tipe XMLDOMNode), dan seterusnya. Properti OwnerDocument mengembalikan objek bertipe XMLDOMDocument yang mengidentifikasi dokumen XML itu sendiri. Properti yang tercantum di atas memudahkan untuk menavigasi pohon dokumen.</p> <p>Sekarang mari kita ulangi semua cabang dokumen XML:</p><p>Root:= XMLDoc.DocumentElement; Untuk I:= 0 hingga Root.ChildNodes.Length-1 lakukan Begin Node:= Root.ChildNodes.Item[I]; Jika Node.HasChildNodes Kemudian GetChilds(Node,0); akhir;</p><p>Seperti disebutkan di atas, SelectNodes dari objek XMLDOMNode menyediakan cara yang lebih fleksibel untuk mengakses cabang dokumen. Selain itu, ada metode SelectSingleNode yang hanya mengembalikan cabang pertama dari dokumen. Kedua metode ini memungkinkan Anda menentukan templat XSL untuk menemukan cabang.</p> <p>Pertimbangkan proses penggunaan metode SelectNodes untuk mengambil semua cabang yang memiliki cabang CD dan sub-cabang PRICE:</p><p>Root:= XMLDoc.DocumentElement; Node:= Root.SelectNodes('CD/PRICE');</p><p>Semua sub-cabang PRICE dari cabang CD akan ditempatkan di koleksi Nodes. Kami akan kembali ke pembahasan template XSL nanti.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulasi cabang anak</h3> <p>Untuk memanipulasi cabang anak, kita dapat menggunakan metode objek XMLDOMNode (Tabel 2).</p> <p>Untuk menghapus entri tentang disk pertama sepenuhnya, Anda harus menjalankan kode berikut:</p><p>Var XMLDoc: IXMLDOMDocument; Akar: IXMLDOMNode; Simpul: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Salah; XMLDoc.Load('C:\DATA\DATA.xml'); // Dapatkan elemen root Root:= XMLDoc.DocumentElement; Simpul:= Akar; // Hapus cabang anak pertama Node.RemoveChild(Node.FirstChild);</p><p>Perhatikan bahwa dalam contoh ini kami menghapus cabang anak pertama. Cara menghapus elemen pertama dari cabang anak pertama ditunjukkan di bawah ini:</p><p>Var XMLDoc: IXMLDOMDocument; Akar: IXMLDOMNode; Simpul: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Salah; XMLDoc.Load('C:\DATA\DATA.xml'); // Dapatkan elemen root Root:= XMLDoc.DocumentElement; // dan cabang anak pertama Node:= Root.FirstChild; // Hapus cabang anak pertama Node.RemoveChild(Node.FirstChild);</p><p>Dalam contoh di atas, kami belum menghapus cabang pertama <CD>…</CD>, dan elemen pertama dari cabang adalah <TITLE>….

Sekarang mari kita tambahkan cabang baru. Di bawah ini adalah kode yang menunjukkan cara menambahkan entri CD-ROM musik baru:

Var Node Baru: IXMLDOMNode; Anak: IXMLDOMNode; ... // Buat cabang baru - Node Baru:= XMLDoc.CreateNode(1, 'CD', ''); // Tambahkan elemen Anak:= XMLDoc.CreateNode(1,'TITLE',''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= 'Pink Floyd'; // Tambahkan elemen <ARTIST>Anak:= XMLDoc.CreateNode(1, 'ARTIST', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= 'Division Bell'; // Tambahkan elemen <COUNTRY>Anak:= XMLDoc.CreateNode(1, 'NEGARA', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= 'UK'; // Tambahkan elemen <COMPANY>Anak:= XMLDoc.CreateNode(1, 'PERUSAHAAN', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= 'EMI Records Ltd.'; // Tambahkan elemen <PRICE>Anak:= XMLDoc.CreateNode(1, 'PRICE', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= '11.99"; // Tambahkan elemen <YEAR>Anak:= XMLDoc.CreateNode(1, 'TAHUN', ''); // Tambahkan elemen NewNode.AppendChild(Child); // Dan atur nilainya Child.Text:= '1994'; // Dan tambahkan cabang Root.AppendChild(NewNode); ...</p><p>Kode di atas menunjukkan urutan langkah-langkah berikut untuk menambahkan cabang baru:</p> <ul><li>Membuat cabang baru menggunakan metode CreateNode: <ul><li>membuat elemen menggunakan metode CreateNode;</li> <li>menambahkan elemen ke cabang menggunakan metode AppendChild;</li> <li>mengatur nilai elemen melalui properti Text;</li> <li>... ulangi untuk semua elemen.</li> </ul></li> <li>Menambahkan cabang baru ke dokumen menggunakan metode AppendChild.</li> </ul><p>Ingatlah bahwa metode AppendChild menambahkan cabang ke ujung pohon. Untuk menambahkan cabang ke lokasi tertentu di pohon, Anda harus menggunakan metode InsertBefore.</p> <h2>Set cabang - objek XMLDOMNodeList</h2> <p>Objek XMLNodeList berisi daftar cabang, yang dapat dibangun menggunakan metode SelectNodes atau GetElementsByTagName, atau diambil dari properti ChildNodes.</p> <p>Kita telah melihat penggunaan objek ini dalam contoh yang diberikan di bagian "Menavigasi Pohon Dokumen". Di sini kami menyajikan beberapa pernyataan teoretis.</p> <p>Jumlah cabang dalam daftar dapat diperoleh sebagai nilai dari properti Panjang. Cabang-cabang memiliki indeks dari 0 hingga Panjang-1, dan setiap cabang individu dapat diakses melalui elemen array Item dengan indeks yang sesuai.</p> <p>Memindahkan daftar cabang juga dapat dilakukan dengan menggunakan metode NextNode, yang mengembalikan cabang berikutnya dalam daftar, atau Nil jika cabang saat ini adalah yang terakhir. Untuk kembali ke awal daftar, panggil metode Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Buat dan simpan dokumen</h2> <p>Jadi, kita telah melihat bagaimana Anda dapat menambahkan cabang dan elemen ke dokumen XML yang ada. Sekarang mari kita membuat dokumen XML dengan cepat. Pertama-tama, ingatlah bahwa dokumen dapat dimuat tidak hanya dari URL, tetapi juga dari string biasa. Berikut ini menunjukkan cara membuat elemen root, yang kemudian dapat digunakan untuk membangun elemen lainnya secara dinamis (yang telah kita bahas dalam Memanipulasi Cabang Anak):</p><p>Var XMLDoc: IXMLDOMDocument; Akar: IXMLDOMNode; Simpul: IXMLDOMNode; S: Tali Lebar; ...S:=' <CATALOG></CATALOG>'; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Salah; XMLDoc.LoadXML(S); Root:= XMLDoc.DocumentElement; Node:= XMLDoc.CreateNode(1, 'CD', ''); Root.AppendChild(Node); Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nihil;</p><p>Setelah membangun dokumen XML, kami menyimpannya ke file menggunakan metode Save. Sebagai contoh:</p> <p>XMLDoc.Save('C:\DATA\NEWCD.XML');</p> <p>Selain menyimpan ke file, metode Simpan memungkinkan Anda untuk menyimpan dokumen XML ke objek XMLDOMDocument baru. Dalam hal ini, dokumen diproses sepenuhnya dan, sebagai hasilnya, struktur dan sintaksnya diperiksa. Berikut ini menunjukkan cara menyimpan dokumen di objek lain:</p><p>Prosedur TForm1.Button2Click(Pengirim: TObject); var XMLDoc2: IXMLDOMDocument; mulai XMLDoc2:= CoDOMDocument.Create; XMLDoc.Simpan(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nihil; akhir;</p><p>Terakhir, metode Simpan juga memungkinkan Anda untuk menyimpan dokumen XML ke objek COM lain yang mendukung antarmuka IStream, IPersistStream, atau IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Menggunakan Template XSL</h2> <p>Saat membahas metode SelectNodes dari objek XMLDOMNode, kami menyebutkan bahwa metode ini menyediakan cara yang lebih fleksibel untuk mengakses cabang dokumen. Fleksibilitasnya adalah Anda dapat menentukan template XSL sebagai kriteria untuk memilih cabang. Template tersebut menyediakan mekanisme yang kuat untuk menemukan informasi dalam dokumen XML. Misalnya, untuk mendapatkan daftar semua judul CD-ROM musik di katalog kami, kami dapat menjalankan kueri berikut:</p><p>Untuk mengetahui CD artis mana yang dirilis di AS, kueri dibentuk sebagai berikut:</p><p>Node:= Root.SelectNodes('CD/ARTIST');</p><p>Berikut ini menunjukkan cara menemukan drive pertama di direktori:</p><p>Node:= Root.SelectNodes('CD/TITLE');</p><p>Dan terakhir:</p><p>Node:= Root.SelectNodes('CD/TITLE');</p><p>Untuk menemukan disk Bob Dylan, Anda dapat menjalankan kueri berikut:</p><p>Node:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');</p><p>dan untuk mendapatkan daftar disk yang dirilis setelah 1985, kami menjalankan kueri berikut:</p><p>Node:= Root.SelectNodes('CD/TITLE');</p><p>Diskusi yang lebih rinci tentang sintaks XSL memerlukan posting terpisah. Untuk menggugah pembaca dan mendorong penelitian lebih lanjut, saya hanya akan memberikan satu contoh kecil tentang kemungkinan penggunaan XSL. Katakanlah kita perlu mengubah direktori kita menjadi tabel HTML biasa. Menggunakan metode tradisional, kita harus melewati semua cabang pohon dan membentuk tag yang sesuai untuk setiap elemen yang diterima. <TD>…</TD>.</p> <p>Menggunakan XSL, kita cukup membuat template (atau style sheet) di mana kita menentukan apa dan bagaimana mengubahnya. Kemudian kami menerapkan templat ini pada katalog kami - dan Anda selesai: kami memiliki teks templat XSL yang mengubah katalog menjadi tabel (Daftar 2).</p> <p>Kode untuk overlay template XSL pada direktori kami terlihat seperti ini:</p><p>Prosedur TForm1.Button2Click(Pengirim: TObject); var XSLdoc: IXMLDOMDocument; mulai XSLdoc:= CoDOMDocument.Create; XSLdoc.Load('C:\DATA\DATA.xsl'); Memo2.Teks:= XMLDoc.TransformNode(XSLDoc); XSLdoc:= Nihil; akhir;</p><p>Mengakhiri diskusi kita tentang XSL, harus dikatakan bahwa saat ini bahasa ini secara aktif digunakan untuk transformasi antara dokumen XML yang berbeda, serta untuk pemformatan dokumen.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Kesimpulan</h2> <p>Untuk alasan yang jelas, tidak mungkin untuk menutupi semua objek Microsoft XML DOM dan memberikan contoh penggunaannya dalam satu artikel. Di sini kita hanya menyentuh masalah utama penggunaan XML DOM dalam aplikasi. Di meja. Gambar 3 menunjukkan semua objek yang diimplementasikan dalam Microsoft XML DOM.</p> <p>KomputerTekan 12"2000</p> <p>Saya menyambut semua orang! Selama beberapa tahun saya menulis di Matlab, dan kemudian saya tidak sabar untuk menulis program di Delphi.</p><p>Saya perlu belajar bagaimana bekerja dengan dokumen xml. Saya bekerja di RAD Stiduo XE3. Ada komponen TXMLDocument, yang mungkin diketahui oleh banyak programmer Delphi. Sepertinya dia bisa melakukan banyak hal. Tapi masalahnya adalah tidak ada dokumentasi dan deskripsi yang jelas untuk itu. Bantuan di RAD Studio adalah sampah, karena tidak ada informasi normal di sana; hanya sedikit bantuan yang tersebar di halaman pada beberapa metode dan prosedur (tanpa contoh dan deskripsi normal). Menggeledah semua Internet. Saya hanya menemukan topik di forum dengan tugas tertentu, di mana Anda harus menebak selama satu jam lagi apa yang dilakukan baris ini atau itu, terkait dengan mengakses file xml. <br>Saya juga membutuhkan panduan untuk fungsi utama, prosedur dan metode yang digunakan saat bekerja dengan xml. Buku teks, manual, deskripsi. Atau setidaknya "xml di Delphi untuk boneka". Sebagai contoh:</p><p><i>Untuk membuka file xml, gunakan metode XMLDocument1.LoadFromFile("filemane.xml"), dengan nama file adalah nama file. <br>Variabel nodelist dari tipe IXMLNode digunakan untuk menyimpan daftar elemen anak. Untuk menentukan daftar ini, gunakan metode Xmldocument1.DocumentElement (dengan XMLDocument1 adalah file xml yang sedang diperiksa). <br>Untuk mengkueri konten elemen anak "elemen1" gunakan metode XMLDocument1.DocumentElement.ChildNodes[ "element1"].Text.... <br></i><br>dan dalam semangat ini lebih lanjut pada semua metode, prosedur, tipe data yang diterapkan. <br>Di mana saya dapat menemukan manual/deskripsi seperti itu? Siapa yang bisa membantu?</p><p>Jika Anda membutuhkan tugas tertentu, saya akan menjelaskannya. <br>Saya memiliki dokumen xml seperti ini:</p><p> <br><ltm version="1.0" type="settings" ><br><progname>LTM</progname></p><p><templateFiles><br> <assets>fon.png</assets><br> <assets>up.jpg</assets><br> <images><br> <pano> <tiles>pano_u.jpg</tiles><br> <tiles>pano_f.jpg</tiles><br> </pano><br> <tour><br> <tourimages>mulai.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">beberapa teks</data><br><data name="onerror" mode="noVoice">beberapa teks kesalahan</data><br><data name="onerror" mode="alarm">teks kesalahan lainnya</data></p><p>Dalam kode program kita memiliki:</p><p>var <br>...<br>induk, anak1: IXMLNode;</p><p>mulai <br>XMLDocument1.LoadFromFile("f:\namafile.xml"); <br>XMLDocument1.Active:=true; <br>.<br>.<br>akhir</p><p>Apa yang perlu Anda pelajari untuk dilakukan: <br>(Saya mohon maaf sebelumnya jika saya salah menyebutkan komponen dokumen xml) <br>1. Dapatkan nama elemen root (dalam kasus kami, ltm), serta daftar atributnya (versi, jenis) dan nilainya ("1.0", "pengaturan"). <br>2. Dapatkan jumlah elemen yang merupakan anak-anak dari akar. Dalam hal ini ada 7 diantaranya : templateFiles,dimension,hotspot,hotspot,data,data,data. Dapatkan nama elemen (tag) (templateFile, dimensi, dll.). Setelah mendapatkan jumlah elemen dan mempelajari cara mengekstrak namanya, saya akan mengulang dari 0 ke hitungan-1 dan melakukan apa yang saya butuhkan. <br>3. Dapatkan jumlah dan daftar atribut dari elemen yang dibutuhkan. Misalnya untuk elemen hotspot. Jawaban yang benar adalah 4 atribut. Untuk elemen hotspot pertama, ini akan menjadi nama, gaya, adegan, ath. Untuk yang kedua - sama, hanya sebagai ganti atribut ath - atribut rz. <br>Perhatikan bahwa ada 2 elemen hotspot dalam file, dengan atribut yang berbeda. Inilah cara bekerja dengan mereka (jika ada lebih dari 1 elemen dengan nama yang sama)? <br>Saya ingin begitu: Saya menerima daftar elemen anak di rel. ke yang root (lihat poin 2), saya menjalankan loop melalui mereka dengan for dan menemukan elemen hotspot yang parameter namanya sama dengan yang diperlukan (katakanlah "hs015_2" - pasti akan ada satu elemen seperti itu). Apakah ada cara untuk menyelesaikan masalah ini tanpa loop? Yaitu, dapatkan nilai atribut scene untuk elemen hotspot yang memiliki name="hs015_2"? <br>4. Lakukan hal di atas terhadap node dan elemen yang merupakan anak dari anak. Dalam contoh saya, sebuah simpul (anak dari dan induk dari dan. <br>Jika saya mengerti dengan benar, Anda perlu entah bagaimana mentransfer konten node ke <a href="https://obanracer.ru/id/tipy-peremennyh-visual-basic-yazyk-programmirovaniya-visual-basic-tipy-dannyh.html">jenis variabel</a> IXMLNode dan lakukan hal yang sama seperti pada paragraf 1-3. Jadi?</p><p>5. Anda perlu mempelajari cara mengubah parameter di atas (atur sendiri).</p><p>Sepertinya itu saja untuk saat ini. Pada tahap ini, konstruksi sintaksis adalah yang paling penting bagi saya. <br>Siapa yang memiliki topik ini, silakan tulis konstruksi sintaksis lain untuk menyelesaikan pertanyaan di atas (bagaimana mendapatkan atribut, nomornya, jumlah elemennya, namanya, dll.). Hal utama sekarang adalah menguasai sintaks, dan saya akan mengimplementasikan algoritma saya nanti. Banyak terima kasih sebelumnya untuk semua orang!</p><p>P.S. Saya benar-benar tidak ingin menulis parser XML saya sendiri dari awal hanya karena tidak ada deskripsi normal untuk yang sudah ada.</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>Artikel sebelumnya</span><a href="https://obanracer.ru/id/sredstva-svyazi-vtoroi-mirovoi-voiny-vermaht-mobilniki-vremen.html">Komunikasi Perang Dunia Kedua</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>Artikel berikutnya</span><a href="https://obanracer.ru/id/takticheskie-sovety-karty-wot-world-of-tanks-shematicheskaya-taktika-na.html">Petakan taktik skematis World of tanks di peta</a></div> <!-- /next_post --> </div> </div> <div class="td-author-name vcard author" style="display: none"><span class="fn"><a href="https://obanracer.ru/id/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="#">ARTIKEL TERKAIT</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/id/gidroakusticheskie-antenny-gidroakusticheskaya-antenna-obem-informacii-s.html" rel="bookmark" title="Antena hidroakustik Jumlah informasi dari antena hidroakustik"><img width="218" height="150" class="entry-thumb" src="/uploads/f94cd284751eb9479f8c5b7c7a0f7209.jpg" alt="Antena hidroakustik Jumlah informasi dari antena hidroakustik" title="Antena hidroakustik Jumlah informasi dari antena hidroakustik"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/category/power-supply/" class="td-post-category">Catu daya</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/gidroakusticheskie-antenny-gidroakusticheskaya-antenna-obem-informacii-s.html" rel="bookmark" title="Antena hidroakustik Jumlah informasi dari antena hidroakustik">Antena hidroakustik Jumlah informasi dari antena hidroakustik</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/id/gaid-v-detalyah-obnovlenie-android-kak-obnovitsya-do-novoi-versii.html" rel="bookmark" title="Pembaruan Android: bagaimana cara meningkatkan ke versi baru, kembalikan?"><img width="218" height="150" class="entry-thumb" src="/uploads/d409f97dfe876af79fe7955f1ddf92bb.jpg" alt="Pembaruan Android: bagaimana cara meningkatkan ke versi baru, kembalikan?" title="Pembaruan Android: bagaimana cara meningkatkan ke versi baru, kembalikan?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/category/windows-8/" class="td-post-category">Windows 8</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/gaid-v-detalyah-obnovlenie-android-kak-obnovitsya-do-novoi-versii.html" rel="bookmark" title="Pembaruan Android: bagaimana cara meningkatkan ke versi baru, kembalikan?">Pembaruan Android: bagaimana cara meningkatkan ke versi baru, kembalikan?</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/id/gidroakusticheskaya-stanciya-argonavt-znachenie-gidroakusticheskaya-stanciya-v.html" rel="bookmark" title="Nilai stasiun hidroakustik dalam ensiklopedia besar Soviet, bse"><img width="218" height="150" class="entry-thumb" src="/uploads/19357dded3a54a484709c397ed978b0f.jpg" alt="Nilai stasiun hidroakustik dalam ensiklopedia besar Soviet, bse" title="Nilai stasiun hidroakustik dalam ensiklopedia besar Soviet, bse"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/category/power-supply/" class="td-post-category">Catu daya</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/gidroakusticheskaya-stanciya-argonavt-znachenie-gidroakusticheskaya-stanciya-v.html" rel="bookmark" title="Nilai stasiun hidroakustik dalam ensiklopedia besar Soviet, bse">Nilai stasiun hidroakustik dalam ensiklopedia besar Soviet, bse</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/id/cifrovaya-kartografiya-cifrovaya-karta-yavlyaetsya-osnovoi-informacionnogo.html" rel="bookmark" title="Peta digital adalah dasar dukungan informasi untuk sistem kartografi otomatis (ACS) dan sistem informasi geografis (GIS) dan dapat menjadi hasil kerja mereka."><img width="218" height="150" class="entry-thumb" src="/uploads/1d3a752050ad9c1b60be21b74ec83c13.jpg" alt="Peta digital adalah dasar dukungan informasi untuk sistem kartografi otomatis (ACS) dan sistem informasi geografis (GIS) dan dapat menjadi hasil kerja mereka." title="Peta digital adalah dasar dukungan informasi untuk sistem kartografi otomatis (ACS) dan sistem informasi geografis (GIS) dan dapat menjadi hasil kerja mereka."/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/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/id/cifrovaya-kartografiya-cifrovaya-karta-yavlyaetsya-osnovoi-informacionnogo.html" rel="bookmark" title="Peta digital adalah dasar dukungan informasi untuk sistem kartografi otomatis (ACS) dan sistem informasi geografis (GIS) dan dapat menjadi hasil kerja mereka.">Peta digital adalah dasar dukungan informasi untuk sistem kartografi otomatis (ACS) dan sistem informasi geografis (GIS) dan dapat menjadi hasil kerja mereka.</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/id/elektronnyi-akselerometr-chto-takoe-akselerometr-v.html" rel="bookmark" title="Apa itu akselerometer di smartphone"><img width="218" height="150" class="entry-thumb" src="/uploads/6d6896ad7eef57174b6279e5d572dd7c.jpg" alt="Apa itu akselerometer di smartphone" title="Apa itu akselerometer di smartphone"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/category/the-winchesters/" class="td-post-category">Winchester</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/elektronnyi-akselerometr-chto-takoe-akselerometr-v.html" rel="bookmark" title="Apa itu akselerometer di smartphone">Apa itu akselerometer di smartphone</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/id/hladnokrovnyi-vbulletin-kakoi-forum-luchshe-vbulletin-ili-punbb.html" rel="bookmark" title="Forum mana yang lebih baik vBulletin atau PunBB"><img width="218" height="150" class="entry-thumb" src="/uploads/2ca7f441005578d8eea0668e5df25e61.jpg" alt="Forum mana yang lebih baik vBulletin atau PunBB" title="Forum mana yang lebih baik vBulletin atau PunBB"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/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/id/hladnokrovnyi-vbulletin-kakoi-forum-luchshe-vbulletin-ili-punbb.html" rel="bookmark" title="Forum mana yang lebih baik vBulletin atau PunBB">Forum mana yang lebih baik vBulletin atau PunBB</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/id/gde-na-klaviature-vertikalnaya-palochka-simvol-pryamaya-palochka-kak.html" rel="bookmark" title="Simbol"Прямая палочка" – как напечатать в Word?"><img width="218" height="150" class="entry-thumb" src="/uploads/7f72ccf04adfa320a8f82f063ccc0b50.jpg" alt="Simbol"Прямая палочка" – как напечатать в Word?" title="Simbol"Прямая палочка" – как напечатать в Word?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/category/the-winchesters/" class="td-post-category">Winchester</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/gde-na-klaviature-vertikalnaya-palochka-simvol-pryamaya-palochka-kak.html" rel="bookmark" title="Simbol"Прямая палочка" – как напечатать в Word?">Simbol "Stik lurus" - bagaimana cara mencetak di Word?</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/id/pervyi-proezd-panamskim-kanalom-panamskii-kanal-opisanie-istoriya.html" rel="bookmark" title="Terusan Panama: deskripsi, sejarah, koordinat, dan fakta menarik"><img width="218" height="150" class="entry-thumb" src="/uploads/4dad7da5539ec0863e9e8b6533d83e51.jpg" alt="Terusan Panama: deskripsi, sejarah, koordinat, dan fakta menarik" title="Terusan Panama: deskripsi, sejarah, koordinat, dan fakta menarik"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/category/security/" class="td-post-category">Keamanan</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/pervyi-proezd-panamskim-kanalom-panamskii-kanal-opisanie-istoriya.html" rel="bookmark" title="Terusan Panama: deskripsi, sejarah, koordinat, dan fakta menarik">Terusan Panama: deskripsi, sejarah, koordinat, dan fakta menarik</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/id/kompleksy-apparatno-programmnye-orlan-orlan-m-orlan-r-belogolovyi.html" rel="bookmark" title="Tanda Persetujuan Tipe Elang Botak"><img width="218" height="150" class="entry-thumb" src="/uploads/1bd46e87c9ae4e1180cd539f76b69ff7.jpg" alt="Tanda Persetujuan Tipe Elang Botak" title="Tanda Persetujuan Tipe Elang Botak"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/category/windows-8/" class="td-post-category">Windows 8</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/kompleksy-apparatno-programmnye-orlan-orlan-m-orlan-r-belogolovyi.html" rel="bookmark" title="Tanda Persetujuan Tipe Elang Botak">Tanda Persetujuan Tipe Elang Botak</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">Direkomendasikan</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/id/komanduyushchii-baltflotom-predstavil-novogo-komandira-leningradskoi.html" rel="bookmark" title="Divisi Kapal Pendukung Pangkalan Angkatan Laut Leningrad ke-32"><img width="324" height="235" class="entry-thumb" src="/uploads/12b6b97cedc3549788161d891e9683dd.jpg" alt="Divisi Kapal Pendukung Pangkalan Angkatan Laut Leningrad ke-32" title="Divisi Kapal Pendukung Pangkalan Angkatan Laut Leningrad ke-32"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/id/category/graphics-card/" class="td-post-category">Kartu video</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/komanduyushchii-baltflotom-predstavil-novogo-komandira-leningradskoi.html" rel="bookmark" title="Divisi Kapal Pendukung Pangkalan Angkatan Laut Leningrad ke-32">Divisi Kapal Pendukung Pangkalan Angkatan Laut Leningrad ke-32</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">Pangkalan Angkatan Laut Leningrad Sejarahnya kembali ke Pangkalan Angkatan Laut Petrograd, yang didirikan pada Maret 1919. Selama Perang Saudara, personelnya aktif...</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/id/kto-sozdal-instagram-i-kogda-instagram-chto-eto-takoe-i-kak-im.html" rel="bookmark" title="Instagram - apa itu dan bagaimana menggunakannya, cara mendaftar di Instagram dari komputer dan melihat secara online"><img width="100" height="70" class="entry-thumb" src="/uploads/f851f0c15cc826d45388a808e4afb7c5.jpg" alt="Instagram - apa itu dan bagaimana menggunakannya, cara mendaftar di Instagram dari komputer dan melihat secara online" title="Instagram - apa itu dan bagaimana menggunakannya, cara mendaftar di Instagram dari komputer dan melihat secara online"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/kto-sozdal-instagram-i-kogda-instagram-chto-eto-takoe-i-kak-im.html" rel="bookmark" title="Instagram - apa itu dan bagaimana menggunakannya, cara mendaftar di Instagram dari komputer dan melihat secara online">Instagram - apa itu dan bagaimana menggunakannya, cara mendaftar di Instagram dari komputer dan melihat secara online</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/id/category/windows-8/" class="td-post-category">Windows 8</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/id/oplata-truda-osnovnyh-proizvodstvennyh-rabo-chih-raspredelenie.html" rel="bookmark" title="Distribusi pendapatan kolektif di antara anggota brigade"><img width="100" height="70" class="entry-thumb" src="/uploads/3815948f015d8ab99260232792c93bf8.jpg" alt="Distribusi pendapatan kolektif di antara anggota brigade" title="Distribusi pendapatan kolektif di antara anggota brigade"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/oplata-truda-osnovnyh-proizvodstvennyh-rabo-chih-raspredelenie.html" rel="bookmark" title="Distribusi pendapatan kolektif di antara anggota brigade">Distribusi pendapatan kolektif di antara anggota brigade</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/id/category/case/" class="td-post-category">Korps</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/id/testovoe-zadanie-dlya-menedzhera-proektov-testovoe-zadanie-na-vakansiyu.html" rel="bookmark" title="Tugas tes untuk lowongan manajer akun pemula"><img width="100" height="70" class="entry-thumb" src="/uploads/c765636165d4ff21ecd3869d90000eb8.jpg" alt="Tugas tes untuk lowongan manajer akun pemula" title="Tugas tes untuk lowongan manajer akun pemula"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/testovoe-zadanie-dlya-menedzhera-proektov-testovoe-zadanie-na-vakansiyu.html" rel="bookmark" title="Tugas tes untuk lowongan manajer akun pemula">Tugas tes untuk lowongan manajer akun pemula</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/id/category/graphics-card/" class="td-post-category">Kartu video</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/id/kadrovyi-komitet-fundamentalnyi-podhod-integraciya-cennostei.html" rel="bookmark" title="Pendekatan Fundamental: Mengintegrasikan Nilai Perusahaan ke dalam Proses SDM"><img width="100" height="70" class="entry-thumb" src="/uploads/eec789c1cc7020b79ec0b8d709d87f57.jpg" alt="Pendekatan Fundamental: Mengintegrasikan Nilai Perusahaan ke dalam Proses SDM" title="Pendekatan Fundamental: Mengintegrasikan Nilai Perusahaan ke dalam Proses SDM"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/kadrovyi-komitet-fundamentalnyi-podhod-integraciya-cennostei.html" rel="bookmark" title="Pendekatan Fundamental: Mengintegrasikan Nilai Perusahaan ke dalam Proses SDM">Pendekatan Fundamental: Mengintegrasikan Nilai Perusahaan ke dalam Proses SDM</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/id/category/security/" class="td-post-category">Keamanan</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/id/otdel-po-kadrovomu-administrirovaniyu-fundamentalnyi-podhod-integraciya.html" rel="bookmark" title="Pendekatan fundamental: mengintegrasikan nilai-nilai perusahaan ke dalam proses SDM Nilai-nilai apa yang dilanggar dalam situasi yang sedang dipertimbangkan"><img width="100" height="70" class="entry-thumb" src="/uploads/0199e01ea05f537c6dfb1494aad6a0d9.jpg" alt="Pendekatan fundamental: mengintegrasikan nilai-nilai perusahaan ke dalam proses SDM Nilai-nilai apa yang dilanggar dalam situasi yang sedang dipertimbangkan" title="Pendekatan fundamental: mengintegrasikan nilai-nilai perusahaan ke dalam proses SDM Nilai-nilai apa yang dilanggar dalam situasi yang sedang dipertimbangkan"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/otdel-po-kadrovomu-administrirovaniyu-fundamentalnyi-podhod-integraciya.html" rel="bookmark" title="Pendekatan fundamental: mengintegrasikan nilai-nilai perusahaan ke dalam proses SDM Nilai-nilai apa yang dilanggar dalam situasi yang sedang dipertimbangkan">Pendekatan fundamental: mengintegrasikan nilai-nilai perusahaan ke dalam proses SDM Nilai-nilai apa yang dilanggar dalam situasi yang sedang dipertimbangkan</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/id/category/power-supply/" class="td-post-category">Catu daya</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/id/nemeckie-kavychki-kavychki-byvayut-raznymi-kavychki-ispolzuemye-v-russkom.html" rel="bookmark" title="kutipan Jerman. Kutipan berbeda. Tanda kutip yang digunakan dalam bahasa Rusia"><img width="100" height="70" class="entry-thumb" src="/uploads/cae981fe0b7169dc6f95fda2b82ba3fc.jpg" alt="kutipan Jerman. Kutipan berbeda. Tanda kutip yang digunakan dalam bahasa Rusia" title="kutipan Jerman. Kutipan berbeda. Tanda kutip yang digunakan dalam bahasa Rusia"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/id/nemeckie-kavychki-kavychki-byvayut-raznymi-kavychki-ispolzuemye-v-russkom.html" rel="bookmark" title="kutipan Jerman. Kutipan berbeda. Tanda kutip yang digunakan dalam bahasa Rusia">kutipan Jerman. Kutipan berbeda. Tanda kutip yang digunakan dalam bahasa Rusia</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/id/category/monitors/" class="td-post-category">monitor</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/id/kakie-bukvy-mozhno-ispolzovat-v-prilozheniyah-trebovaniya-gostov-k.html" rel="bookmark" title="Persyaratan tamu untuk desain karya ilmiah"><img width="218" height="150" class="entry-thumb" src="/uploads/2d085c4c2c01847dea5ec003f7dcc7d6.jpg" alt="Persyaratan tamu untuk desain karya ilmiah" title="Persyaratan tamu untuk desain karya ilmiah"/ 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/id/kakie-bukvy-mozhno-ispolzovat-v-prilozheniyah-trebovaniya-gostov-k.html" rel="bookmark" title="Persyaratan tamu untuk desain karya ilmiah">Persyaratan tamu untuk desain karya ilmiah</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/id/naiti-nemcev-dlya-izucheniya-nemeckogo-yazyka-obshchenie-s-inostrancami-rabota.html" rel="bookmark" title="Temukan orang Jerman untuk belajar bahasa Jerman"><img width="218" height="150" class="entry-thumb" src="/uploads/3190f6163311125ae61b74dc04f87588.jpg" alt="Temukan orang Jerman untuk belajar bahasa Jerman" title="Temukan orang Jerman untuk belajar bahasa Jerman"/ 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/id/naiti-nemcev-dlya-izucheniya-nemeckogo-yazyka-obshchenie-s-inostrancami-rabota.html" rel="bookmark" title="Temukan orang Jerman untuk belajar bahasa Jerman">Temukan orang Jerman untuk belajar bahasa Jerman</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/id/n-gramm-uluchshenie-vnutrennei-optimizacii-s-pomoshchyu-konkurentov-smotret-chto-takoe-n-gramm-v-drugi.html" rel="bookmark" title="Meningkatkan pengoptimalan internal dengan bantuan pesaing Lihat apa itu"N-грамм" в других словарях"><img width="218" height="150" class="entry-thumb" src="/uploads/e75d40c75a1c81bfdaa953ea712ea7f1.jpg" alt="Meningkatkan pengoptimalan internal dengan bantuan pesaing Lihat apa itu"N-грамм" в других словарях" title="Meningkatkan pengoptimalan internal dengan bantuan pesaing Lihat apa itu"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/id/n-gramm-uluchshenie-vnutrennei-optimizacii-s-pomoshchyu-konkurentov-smotret-chto-takoe-n-gramm-v-drugi.html" rel="bookmark" title="Meningkatkan pengoptimalan internal dengan bantuan pesaing Lihat apa itu"N-грамм" в других словарях">Meningkatkan pengoptimalan internal dengan bantuan pesaing Lihat apa itu "N-gram" di kamus lain</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/id/tipograficheskie-oshibki-tipografskaya-oshibka-chem-otlichaetsya-defis-ot.html" rel="bookmark" title="Kesalahan tipografi. Kesalahan tipografis. Apa perbedaan antara tanda hubung dan tanda hubung"><img width="218" height="150" class="entry-thumb" src="/uploads/8ea6e0a7f6a9b0f0d0cb57847e55133f.jpg" alt="Kesalahan tipografi. Kesalahan tipografis. Apa perbedaan antara tanda hubung dan tanda hubung" title="Kesalahan tipografi. Kesalahan tipografis. Apa perbedaan antara tanda hubung dan tanda hubung"/ 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/id/tipograficheskie-oshibki-tipografskaya-oshibka-chem-otlichaetsya-defis-ot.html" rel="bookmark" title="Kesalahan tipografi. Kesalahan tipografis. Apa perbedaan antara tanda hubung dan tanda hubung">Kesalahan tipografi. Kesalahan tipografis. Apa perbedaan antara tanda hubung dan tanda hubung</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/id/kak-pravilno-zapolnyat-tablicu-trebovaniya-gostov-k-oformleniyu.html" rel="bookmark" title="Persyaratan tamu untuk desain karya ilmiah"><img width="218" height="150" class="entry-thumb" src="/uploads/928bcb0efcb55098bec32c41e5552e35.jpg" alt="Persyaratan tamu untuk desain karya ilmiah" title="Persyaratan tamu untuk desain karya ilmiah"/ 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/id/kak-pravilno-zapolnyat-tablicu-trebovaniya-gostov-k-oformleniyu.html" rel="bookmark" title="Persyaratan tamu untuk desain karya ilmiah">Persyaratan tamu untuk desain karya ilmiah</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/id/kak-pereiti-na-nemeckii-na-klaviature-kompyutera-pechataem.html" rel="bookmark" title="Kami mengetik dalam bahasa Jerman tanpa memiliki keyboard Jerman!"><img width="218" height="150" class="entry-thumb" src="/uploads/197824bb687fee58db14d2904a94f137.jpg" alt="Kami mengetik dalam bahasa Jerman tanpa memiliki keyboard Jerman!" title="Kami mengetik dalam bahasa Jerman tanpa memiliki keyboard Jerman!"/ 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/id/kak-pereiti-na-nemeckii-na-klaviature-kompyutera-pechataem.html" rel="bookmark" title="Kami mengetik dalam bahasa Jerman tanpa memiliki keyboard Jerman!">Kami mengetik dalam bahasa Jerman tanpa memiliki keyboard Jerman!</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/id/primery-bibliograficheskih-ssylok-trebovaniya-k-oformleniyu-spiska-literatury.html" rel="bookmark" title="Persyaratan Desain Daftar Rujukan Subskrip Daftar Pustaka"><img width="218" height="150" class="entry-thumb" src="/uploads/43ff8df1aee7da500fcd86fec90ddece.jpg" alt="Persyaratan Desain Daftar Rujukan Subskrip Daftar Pustaka" title="Persyaratan Desain Daftar Rujukan Subskrip Daftar Pustaka"/ 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/id/primery-bibliograficheskih-ssylok-trebovaniya-k-oformleniyu-spiska-literatury.html" rel="bookmark" title="Persyaratan Desain Daftar Rujukan Subskrip Daftar Pustaka">Persyaratan Desain Daftar Rujukan Subskrip Daftar Pustaka</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/id/proga-dlya-ustanovki-igr-na-android-kak-otkryt-apk-fail-na.html" rel="bookmark" title="Cara membuka file APK di komputer"><img width="218" height="150" class="entry-thumb" src="/uploads/0e4df840f66bc4833bb4c5642584c323.jpg" alt="Cara membuka file APK di komputer" title="Cara membuka file APK di komputer"/ 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/id/proga-dlya-ustanovki-igr-na-android-kak-otkryt-apk-fail-na.html" rel="bookmark" title="Cara membuka file APK di komputer">Cara membuka file APK di komputer</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/id/kak-ustanovit-fail-ark-na-kompyuter-kak-ustanavlivat.html" rel="bookmark" title="Cara instal file apk di android"><img width="218" height="150" class="entry-thumb" src="/uploads/a1a6f9fe904c9c21005c1413fdba767f.jpg" alt="Cara instal file apk di android" title="Cara instal file apk di android"/ 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/id/kak-ustanovit-fail-ark-na-kompyuter-kak-ustanavlivat.html" rel="bookmark" title="Cara instal file apk di android">Cara instal file apk di android</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/id/kakaya-yacheika-nazyvaetsya-aktivnoi-v-eksel-funkciya-yacheika-v-excel-i-primery-ee.html" rel="bookmark" title="Fungsi sel di excel dan contoh penggunaannya"><img width="218" height="150" class="entry-thumb" src="/uploads/8ae204d6ab0098a4649c3b368c855c07.jpg" alt="Fungsi sel di excel dan contoh penggunaannya" title="Fungsi sel di excel dan contoh penggunaannya"/ 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/id/kakaya-yacheika-nazyvaetsya-aktivnoi-v-eksel-funkciya-yacheika-v-excel-i-primery-ee.html" rel="bookmark" title="Fungsi sel di excel dan contoh penggunaannya">Fungsi sel di excel dan contoh penggunaannya</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/id/kak-otklyuchit-ogranichit-udalit-revizii-wordpress-kak-otklyuchit-revizii-wordpress.html" rel="bookmark" title="cara menonaktifkan revisi wordpress cara menghapus revisi wordpress"><img width="218" height="150" class="entry-thumb" src="/uploads/07a23bc5bfd919a11a09a5a6c72b762c.jpg" alt="cara menonaktifkan revisi wordpress cara menghapus revisi wordpress" title="cara menonaktifkan revisi wordpress cara menghapus revisi wordpress"/ 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/id/kak-otklyuchit-ogranichit-udalit-revizii-wordpress-kak-otklyuchit-revizii-wordpress.html" rel="bookmark" title="cara menonaktifkan revisi wordpress cara menghapus revisi wordpress">cara menonaktifkan revisi wordpress cara menghapus revisi wordpress</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/id/kak-otklyuchit-revizii-wordpress-kak-udalit-revizii-wordpress.html" rel="bookmark" title="Bagaimana cara menghapus revisi wordpress?"><img width="218" height="150" class="entry-thumb" src="/uploads/33e0db189c641aeba3d365d56f2e20f6.jpg" alt="Bagaimana cara menghapus revisi wordpress?" title="Bagaimana cara menghapus revisi wordpress?"/ 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/id/kak-otklyuchit-revizii-wordpress-kak-udalit-revizii-wordpress.html" rel="bookmark" title="Bagaimana cara menghapus revisi wordpress?">Bagaimana cara menghapus revisi wordpress?</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/id/razblokirovka-bannera-kak-udalit-banner-s-rabochego-stola.html" rel="bookmark" title="Cara menghapus spanduk dari desktop"><img width="218" height="150" class="entry-thumb" src="/uploads/05cf881135cbd65f0f2943ae553694f0.jpg" alt="Cara menghapus spanduk dari desktop" title="Cara menghapus spanduk dari desktop"/ 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/id/razblokirovka-bannera-kak-udalit-banner-s-rabochego-stola.html" rel="bookmark" title="Cara menghapus spanduk dari desktop">Cara menghapus spanduk dari desktop</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/id/servis-ot-kasperskogo-dlya-razblokirovki-windows-udalenie-bannerov-virusov-vymogatelei-mozhno-li-bann.html" rel="bookmark" title="Menghapus spanduk virus ransomware Bisakah spanduk komputer disembuhkan dengan Kaspersky"><img width="218" height="150" class="entry-thumb" src="/uploads/d7f1517682d3f3013f594510a27f2d19.jpg" alt="Menghapus spanduk virus ransomware Bisakah spanduk komputer disembuhkan dengan Kaspersky" title="Menghapus spanduk virus ransomware Bisakah spanduk komputer disembuhkan dengan Kaspersky"/ 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/id/servis-ot-kasperskogo-dlya-razblokirovki-windows-udalenie-bannerov-virusov-vymogatelei-mozhno-li-bann.html" rel="bookmark" title="Menghapus spanduk virus ransomware Bisakah spanduk komputer disembuhkan dengan Kaspersky">Menghapus spanduk virus ransomware Bisakah spanduk komputer disembuhkan dengan Kaspersky</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/id/kak-sdelat-podpisnoi-list-kak-privlech-i-uderzhat-podpischikov.html" rel="bookmark" title="Cara menarik dan mempertahankan pelanggan"><img width="218" height="150" class="entry-thumb" src="/uploads/e36538ed3e998451a478f8a0c39816c2.jpg" alt="Cara menarik dan mempertahankan pelanggan" title="Cara menarik dan mempertahankan pelanggan"/ 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/id/kak-sdelat-podpisnoi-list-kak-privlech-i-uderzhat-podpischikov.html" rel="bookmark" title="Cara menarik dan mempertahankan pelanggan">Cara menarik dan mempertahankan pelanggan</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/id/napisanie-statei-dlya-miralinks-napisanie-statei-dlya-miralinks-raschet-vlozhenii-za.html" rel="bookmark" title="Menulis artikel untuk Miralinks Perhitungan investasi untuk memposting artikel di Miralinks"><img width="218" height="150" class="entry-thumb" src="/uploads/f9af3aeed28202129a7b55d0e5f54433.jpg" alt="Menulis artikel untuk Miralinks Perhitungan investasi untuk memposting artikel di Miralinks" title="Menulis artikel untuk Miralinks Perhitungan investasi untuk memposting artikel di Miralinks"/ 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/id/napisanie-statei-dlya-miralinks-napisanie-statei-dlya-miralinks-raschet-vlozhenii-za.html" rel="bookmark" title="Menulis artikel untuk Miralinks Perhitungan investasi untuk memposting artikel di Miralinks">Menulis artikel untuk Miralinks Perhitungan investasi untuk memposting artikel di Miralinks</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/id/kak-v-fotoshope-sozdat-vektornoe-izobrazhenie-vektor-v-fotoshope-izmenenie.html" rel="bookmark" title="Cara membuat gambar vektor di Photoshop"><img width="218" height="150" class="entry-thumb" src="/uploads/a51e383429d195d05f478e8e0b85a506.jpg" alt="Cara membuat gambar vektor di Photoshop" title="Cara membuat gambar vektor di Photoshop"/ 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/id/kak-v-fotoshope-sozdat-vektornoe-izobrazhenie-vektor-v-fotoshope-izmenenie.html" rel="bookmark" title="Cara membuat gambar vektor di Photoshop">Cara membuat gambar vektor di Photoshop</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/id/kak-udalit-melodii-s-androida-kak-udalit-zavodskie-ringtony-s.html" rel="bookmark" title="Cara menghapus nada dering pabrik dari android"><img width="218" height="150" class="entry-thumb" src="/uploads/86ab4aeddcadeabbfa15f9140de4cbda.jpg" alt="Cara menghapus nada dering pabrik dari android" title="Cara menghapus nada dering pabrik dari android"/ 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/id/kak-udalit-melodii-s-androida-kak-udalit-zavodskie-ringtony-s.html" rel="bookmark" title="Cara menghapus nada dering pabrik dari android">Cara menghapus nada dering pabrik dari android</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">Hak Cipta 2022 - Reparasi komputer dan laptop. Kartu video, hard drive, internet, monitor.</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>