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
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:
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:
hapus elemen penutup
Sekarang mari kita tulis kode yang mengembalikan nilai properti dari objek XMLDOMParseError:
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;
dan jalankan aplikasi kita. Akibatnya, kami mendapatkan informasi kesalahan berikut.
Seperti yang Anda lihat dari contoh di atas, informasi yang dikembalikan oleh objek XMLDOMParseError cukup untuk menemukan kesalahan dan memahami alasan kemunculannya.
Sekarang mari kita kembalikan elemen penutup
Mengakses pohon dokumen
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:
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;
Untuk dokumen XML kami, kami akan mendapatkan teks berikut.
Jika kita tertarik pada cabang tertentu, atau cabang di bawah cabang anak pertama, kita dapat menggunakan metode NodeFromID atau metode GetElementByTagName dari objek XMLDOMDocument.
Metode NodeFromID memerlukan pengidentifikasi unik yang ditentukan dalam Skema XML atau Definisi Jenis Dokumen (DTD) dan mengembalikan cabang dengan pengidentifikasi tersebut.
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:
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;
Untuk dokumen XML kami, kami akan mendapatkan teks berikut:
Perhatikan bahwa metode SelectNodes dari objek XMLDOMNode menyediakan cara yang lebih fleksibel untuk mengakses cabang dokumen. Tetapi lebih lanjut tentang itu di bawah ini.
Cabang dokumen - objek XMLDOMNode
Objek XMLDOMNode mewakili cabang dokumen. Kami telah menemukan objek ini ketika kami mendapatkan elemen root dokumen:
Root:= XMLDoc.DocumentElement;
Untuk mendapatkan informasi tentang cabang dokumen XML, Anda dapat menggunakan properti objek XMLDOMNode (Tabel 1).
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.
Menavigasi pohon dokumen
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.
Sekarang mari kita ulangi semua cabang dokumen XML:
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;
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.
Pertimbangkan proses penggunaan metode SelectNodes untuk mengambil semua cabang yang memiliki cabang CD dan sub-cabang PRICE:
Root:= XMLDoc.DocumentElement; Node:= Root.SelectNodes('CD/PRICE');
Semua sub-cabang PRICE dari cabang CD akan ditempatkan di koleksi Nodes. Kami akan kembali ke pembahasan template XSL nanti.
Manipulasi cabang anak
Untuk memanipulasi cabang anak, kita dapat menggunakan metode objek XMLDOMNode (Tabel 2).
Untuk menghapus entri tentang disk pertama sepenuhnya, Anda harus menjalankan kode berikut:
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);
Perhatikan bahwa dalam contoh ini kami menghapus cabang anak pertama. Cara menghapus elemen pertama dari cabang anak pertama ditunjukkan di bawah ini:
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);
Dalam contoh di atas, kami belum menghapus cabang pertama
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 -
Kode di atas menunjukkan urutan langkah-langkah berikut untuk menambahkan cabang baru:
- Membuat cabang baru menggunakan metode CreateNode:
- membuat elemen menggunakan metode CreateNode;
- menambahkan elemen ke cabang menggunakan metode AppendChild;
- mengatur nilai elemen melalui properti Text;
- ... ulangi untuk semua elemen.
- Menambahkan cabang baru ke dokumen menggunakan metode AppendChild.
Ingatlah bahwa metode AppendChild menambahkan cabang ke ujung pohon. Untuk menambahkan cabang ke lokasi tertentu di pohon, Anda harus menggunakan metode InsertBefore.
Set cabang - objek XMLDOMNodeList
Objek XMLNodeList berisi daftar cabang, yang dapat dibangun menggunakan metode SelectNodes atau GetElementsByTagName, atau diambil dari properti ChildNodes.
Kita telah melihat penggunaan objek ini dalam contoh yang diberikan di bagian "Menavigasi Pohon Dokumen". Di sini kami menyajikan beberapa pernyataan teoretis.
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.
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.
Buat dan simpan dokumen
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):
Var XMLDoc: IXMLDOMDocument; Akar: IXMLDOMNode; Simpul: IXMLDOMNode; S: Tali Lebar; ...S:='
Setelah membangun dokumen XML, kami menyimpannya ke file menggunakan metode Save. Sebagai contoh:
XMLDoc.Save('C:\DATA\NEWCD.XML');
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:
Prosedur TForm1.Button2Click(Pengirim: TObject); var XMLDoc2: IXMLDOMDocument; mulai XMLDoc2:= CoDOMDocument.Create; XMLDoc.Simpan(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nihil; akhir;
Terakhir, metode Simpan juga memungkinkan Anda untuk menyimpan dokumen XML ke objek COM lain yang mendukung antarmuka IStream, IPersistStream, atau IPersistStreamInit.
Menggunakan Template XSL
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:
Untuk mengetahui CD artis mana yang dirilis di AS, kueri dibentuk sebagai berikut:
Node:= Root.SelectNodes('CD/ARTIST');
Berikut ini menunjukkan cara menemukan drive pertama di direktori:
Node:= Root.SelectNodes('CD/TITLE');
Dan terakhir:
Node:= Root.SelectNodes('CD/TITLE');
Untuk menemukan disk Bob Dylan, Anda dapat menjalankan kueri berikut:
Node:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');
dan untuk mendapatkan daftar disk yang dirilis setelah 1985, kami menjalankan kueri berikut:
Node:= Root.SelectNodes('CD/TITLE');
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.
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).
Kode untuk overlay template XSL pada direktori kami terlihat seperti ini:
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;
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.
Kesimpulan
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.
KomputerTekan 12"2000
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 dimanipulasi menggunakan metode khusus yang 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:
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:
hapus elemen penutup
Sekarang mari kita tulis kode yang mengembalikan nilai properti dari objek XMLDOMParseError:
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;
dan jalankan aplikasi kita. Akibatnya, kami mendapatkan informasi kesalahan berikut.
Seperti yang Anda lihat dari contoh di atas, informasi yang dikembalikan oleh objek XMLDOMParseError cukup untuk menemukan kesalahan dan memahami alasan kemunculannya.
Sekarang mari kita kembalikan elemen penutup
Mengakses pohon dokumen
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:
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;
Untuk dokumen XML kami, kami akan mendapatkan teks berikut.
Jika kita tertarik pada cabang tertentu, atau cabang di bawah cabang anak pertama, kita dapat menggunakan metode NodeFromID atau metode GetElementByTagName dari objek XMLDOMDocument.
Metode NodeFromID memerlukan pengidentifikasi unik yang ditentukan dalam Skema XML atau Definisi Jenis Dokumen (DTD) dan mengembalikan cabang dengan pengidentifikasi tersebut.
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:
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;
Untuk dokumen XML kami, kami akan mendapatkan teks berikut:
Perhatikan bahwa metode SelectNodes dari objek XMLDOMNode menyediakan cara yang lebih fleksibel untuk mengakses cabang dokumen. Tetapi lebih lanjut tentang itu di bawah ini.
Cabang dokumen - objek XMLDOMNode
Objek XMLDOMNode mewakili cabang dokumen. Kami telah menemukan objek ini ketika kami mendapatkan elemen root dokumen:
Root:= XMLDoc.DocumentElement;
Untuk mendapatkan informasi tentang cabang dokumen XML, Anda dapat menggunakan properti objek XMLDOMNode (Tabel 1).
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.
Menavigasi pohon dokumen
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.
Sekarang mari kita ulangi semua cabang dokumen XML:
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;
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.
Pertimbangkan proses penggunaan metode SelectNodes untuk mengambil semua cabang yang memiliki cabang CD dan sub-cabang PRICE:
Root:= XMLDoc.DocumentElement; Node:= Root.SelectNodes('CD/PRICE');
Semua sub-cabang PRICE dari cabang CD akan ditempatkan di koleksi Nodes. Kami akan kembali ke pembahasan template XSL nanti.
Manipulasi cabang anak
Untuk memanipulasi cabang anak, kita dapat menggunakan metode objek XMLDOMNode (Tabel 2).
Untuk menghapus entri tentang disk pertama sepenuhnya, Anda harus menjalankan kode berikut:
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);
Perhatikan bahwa dalam contoh ini kami menghapus cabang anak pertama. Cara menghapus elemen pertama dari cabang anak pertama ditunjukkan di bawah ini:
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);
Dalam contoh di atas, kami belum menghapus cabang pertama
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 -
Kode di atas menunjukkan urutan langkah-langkah berikut untuk menambahkan cabang baru:
- Membuat cabang baru menggunakan metode CreateNode:
- membuat elemen menggunakan metode CreateNode;
- menambahkan elemen ke cabang menggunakan metode AppendChild;
- mengatur nilai elemen melalui properti Text;
- ... ulangi untuk semua elemen.
- Menambahkan cabang baru ke dokumen menggunakan metode AppendChild.
Ingatlah bahwa metode AppendChild menambahkan cabang ke ujung pohon. Untuk menambahkan cabang ke lokasi tertentu di pohon, Anda harus menggunakan metode InsertBefore.
Set cabang - objek XMLDOMNodeList
Objek XMLNodeList berisi daftar cabang, yang dapat dibangun menggunakan metode SelectNodes atau GetElementsByTagName, atau diambil dari properti ChildNodes.
Kita telah melihat penggunaan objek ini dalam contoh yang diberikan di bagian "Menavigasi Pohon Dokumen". Di sini kami menyajikan beberapa pernyataan teoretis.
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.
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.
Buat dan simpan dokumen
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):
Var XMLDoc: IXMLDOMDocument; Akar: IXMLDOMNode; Simpul: IXMLDOMNode; S: Tali Lebar; ...S:='
Setelah membangun dokumen XML, kami menyimpannya ke file menggunakan metode Save. Sebagai contoh:
XMLDoc.Save('C:\DATA\NEWCD.XML');
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:
Prosedur TForm1.Button2Click(Pengirim: TObject); var XMLDoc2: IXMLDOMDocument; mulai XMLDoc2:= CoDOMDocument.Create; XMLDoc.Simpan(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nihil; akhir;
Terakhir, metode Simpan juga memungkinkan Anda untuk menyimpan dokumen XML ke objek COM lain yang mendukung antarmuka IStream, IPersistStream, atau IPersistStreamInit.
Menggunakan Template XSL
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:
Untuk mengetahui CD artis mana yang dirilis di AS, kueri dibentuk sebagai berikut:
Node:= Root.SelectNodes('CD/ARTIST');
Berikut ini menunjukkan cara menemukan drive pertama di direktori:
Node:= Root.SelectNodes('CD/TITLE');
Dan terakhir:
Node:= Root.SelectNodes('CD/TITLE');
Untuk menemukan disk Bob Dylan, Anda dapat menjalankan kueri berikut:
Node:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');
dan untuk mendapatkan daftar disk yang dirilis setelah 1985, kami menjalankan kueri berikut:
Node:= Root.SelectNodes('CD/TITLE');
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.
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).
Kode untuk overlay template XSL pada direktori kami terlihat seperti ini:
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;
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.
Kesimpulan
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.
KomputerTekan 12"2000
Saya menyambut semua orang! Selama beberapa tahun saya menulis di Matlab, dan kemudian saya tidak sabar untuk menulis program di Delphi.
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.
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:
Untuk membuka file xml, gunakan metode XMLDocument1.LoadFromFile("filemane.xml"), dengan nama file adalah nama file.
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).
Untuk mengkueri konten elemen anak "elemen1" gunakan metode XMLDocument1.DocumentElement.ChildNodes[ "element1"].Text....
dan dalam semangat ini lebih lanjut pada semua metode, prosedur, tipe data yang diterapkan.
Di mana saya dapat menemukan manual/deskripsi seperti itu? Siapa yang bisa membantu?
Jika Anda membutuhkan tugas tertentu, saya akan menjelaskannya.
Saya memiliki dokumen xml seperti ini:
beberapa teks
beberapa teks kesalahan
teks kesalahan lainnya
Dalam kode program kita memiliki:
var
...
induk, anak1: IXMLNode;
mulai
XMLDocument1.LoadFromFile("f:\namafile.xml");
XMLDocument1.Active:=true;
.
.
akhir
Apa yang perlu Anda pelajari untuk dilakukan:
(Saya mohon maaf sebelumnya jika saya salah menyebutkan komponen dokumen xml)
1. Dapatkan nama elemen root (dalam kasus kami, ltm), serta daftar atributnya (versi, jenis) dan nilainya ("1.0", "pengaturan").
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.
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.
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)?
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"?
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.
Jika saya mengerti dengan benar, Anda perlu entah bagaimana mentransfer konten node ke jenis variabel IXMLNode dan lakukan hal yang sama seperti pada paragraf 1-3. Jadi?
5. Anda perlu mempelajari cara mengubah parameter di atas (atur sendiri).
Sepertinya itu saja untuk saat ini. Pada tahap ini, konstruksi sintaksis adalah yang paling penting bagi saya.
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.S. Saya benar-benar tidak ingin menulis parser XML saya sendiri dari awal hanya karena tidak ada deskripsi normal untuk yang sudah ada.