Meng Xianhui
Karena independensi platform XML (Extensible Markup Language: eXtensible Markup Language), secara bertahap menjadi media utama untuk transmisi data. XML adalah bahasa yang mendeskripsikan dirinya sendiri, dan datanya sendiri sudah berisi metadata, yaitu informasi tentang data itu sendiri. Misalnya: "Mencius Bab E 1757281793923net_lover1807581793923" Kumpulan data ini, sulit untuk dipahami secara harfiah, dan tidak jelas berapa banyak segmen data yang terkandung di dalamnya. Namun, jika kita menggunakan XML untuk mendeskripsikannya sebagai berikut, kita dapat dengan jelas melihat Arti dari setiap segmen data:
<Data Orang>
<Orang>
<Nama>Mencius Bab E</Nama>
<Tinggi>175</Tinggi>
<Berat>72</Berat>
<Tel>81793923</Tel>
</Orang>
<Orang>
<nama>net_lover</nama>
<Tinggi>180</Tinggi>
<Berat>75</Berat>
<Tel>81793923</Tel>
</Orang>
</Data Orang>
Dari potongan XML di atas, kita tidak hanya dapat melihat dengan jelas apa yang diwakili oleh setiap data, tetapi juga mengetahui di mana data tersebut dibagi. Dalam aplikasi biasa, hasil yang kita peroleh mungkin dalam bentuk array, koleksi, atau kumpulan data. Bagaimana cara kita mengonversinya menjadi data berformat XML yang menggambarkan dirinya sendiri? Dari sudut pandang bentuk data, XML adalah format teks sederhana dari string murni. String sangat sederhana, cepat dan mudah untuk ditransfer. Array terkadang sangat lambat untuk ditransfer dengan referensi dan sangat merepotkan untuk diproses, serta pengumpulan dan pencatatan set keduanya adalah objek, yang akan menyebabkan penurunan kinerja komputer selama pemrosesan, dan objek ini dikaitkan dengan platform tertentu, yang mengharuskan platform tersebut memiliki mekanisme pemrosesan bawaan untuk menangani operasi objek. XML sudah menjadi standar W3C dan tidak bergantung pada platform. Satu-satunya persyaratan bagi komputer kita adalah dapat memproses string XML sederhana, yaitu parser XML. Ia dapat mengurai string XML dan dapat dengan mudah menguraikan data melalui antarmuka segmen data independen sehingga kita dapat mengaksesnya. Parser XML berukuran kecil, berkinerja baik, dan dapat ditemukan di setiap platform. Setelah kami menerima data XML dan menguraikannya ke dalam gaya contoh di atas, kami dapat mengonversinya menjadi representasi berbeda melalui XSLT (eXstensible Stylesheet Language Transformations). Menggunakan format data XML untuk transmisi data akan membuat pekerjaan kita menulis kode aplikasi menjadi lebih sederhana dan mudah, serta memiliki skalabilitas yang baik.
Selanjutnya, mari kita lihat cara mengonversi data kita. Contoh kami ditulis di bawah Microsoft Windows 2000, IIS5, MSXML3 dan ADO2.6. Data sampel menggunakan database sampel Northwind yang disertakan dengan Microsoft SQL Server7.0. Alasan mengapa kami menggunakan SQL Server7 daripada SQL Server2000 yang mendukung XML adalah untuk mempertimbangkan prinsip universalitas. Tujuan kami adalah untuk memproses kumpulan catatan yang diperoleh dari berbagai jenis sumber data, tidak hanya untuk mendukung keluaran XML seperti sumber data SQL Server2000 . Gunakan ADO karena memiliki berbagai bentuk dan dapat menangani berbagai jenis sumber data; gunakan XML karena dapat mengirimkan dan menguraikan dengan cepat. Namun metode pemrosesan dalam contoh ini juga cocok untuk lingkungan apa pun dengan parser Microsoft XML, ADO2.5 atau versi Windows, IIS, SQL Server yang lebih baru.
Untuk mempermudah, kami hanya memilih produk yang harga satuannya kurang dari atau sama dengan 20 dolar AS, yang inventarisnya lebih besar atau sama dengan 20 dolar AS, dan yang nama produknya kurang dari atau sama dengan 6 karakter:
<%
Redupkan objekRecordset
Setel objRecordset = Server.CreateObject("ADODB.Recordset")
objRecordset.buka _
"PILIH Nama Produk, Harga Satuan, Unit Dalam Stok " _
& "DARI Produk" _
& "DIMANAHarga Satuan <= 20" _
& "DAN Unit Tersedia >= 20" _
& "DAN LEN(Nama Produk) <= 6 " _
& "PESANAN BERDASARKAN Nama Produk", _
"Penyedia=SQLOLEDB;"
& "Sumber Data=SomeSQLServer;"
& "Katalog Awal=Northwind;"
& "ID Pengguna = Nama Pengguna Saya; _
& "Kata Sandi=Kata Sandi Saya;"
%>
Sekarang, kami menggunakan 3 metode untuk mengubah kumpulan data yang kami peroleh ke dalam format XML.
Pertama, kita dapat menelusuri seluruh kumpulan data, menggunakan XML DOM (Model Objek Dokumen), dan membuat pohon simpul XML:
<%
Redupkan objXMLDOM, objRootNode, objNode
Setel objXMLDOM = Server.CreateObject("MSXML2.DOMDocument")
Setel objRootNode = objXMLDOM.createElement("xml")
objXMLDOM.documentElement = objRootNode
Lakukan Sementara BUKAN objRecordset.EOF
Setel objRowNode = objXMLDOM.createElement("baris")
Setel objNode = objXMLDOM.createElement("Nama Produk")
objNode.text = objRecordset.Fields.Item("Nama Produk").Nilai
objRowNode.appendChild(objNode)
Setel objNode = objXMLDOM.createElement("Harga Unit")
objNode.text = objRecordset.Fields.Item("Harga Unit").Nilai
objRowNode.appendChild(objNode)
Setel objNode = objXMLDOM.createElement("UnitsInStock")
objNode.text = objRecordset.Fields.Item("UnitsInStock").Nilai
objRowNode.appendChild(objNode)
objRootNode.appendChild(objRowNode)
objRecordset.MoveNext
Lingkaran
Setel objNode = Tidak Ada
Setel objRowNode = Tidak Ada
Setel objRootNode = Tidak Ada
Setel objRecordset = Tidak Ada
%>
Sekarang, kita memiliki objek XML DOM. Performa metode ini tidak ideal ketika kumpulan rekaman berukuran besar, karena objek kumpulan rekaman ADO dan objek XML DOM harus disimpan dalam memori sistem pada saat yang bersamaan.
Metode kedua adalah menelusuri kumpulan data dan langsung menghasilkan string XML itu sendiri:
<%
Redupkan strXML
strXML = "<xml>"
objRecordset.MoveFirst
Lakukan Sementara BUKAN objRecordset.EOF
strXML = strXML & "<baris>"
strXML = strXML & "<Nama Produk>" _
& objRecordset.Fields.Item("Nama Produk").Nilai _
& "</Nama Produk>"
strXML = strXML & "<Harga Satuan>" _
& objRecordset.Fields.Item("Harga Satuan").Nilai _
& "</Harga Satuan>"
strXML = strXML & "<UnitsInStock>" _
& objRecordset.Fields.Item("UnitsInStock").Nilai _
& "</Unit Dalam Stok>"
strXML = strXML & "</baris>"
objRecordset.MoveNext
Lingkaran
strXML = strXML & "</xml>"
Setel objRecordset = Tidak Ada
%>
Namun, kelemahan terbesar dari dua metode di atas adalah kode tersebut tidak dapat digunakan kembali. Kami telah menuliskan nama node. Jika kami menanyakan bidang yang berbeda, kami juga harus mengubah kode kami secara manual untuk memenuhi kebutuhan node yang berbeda. Pendekatan kami di bawah ini akan menjadi lebih umum.
Metode ketiga: metode yang dapat digunakan kembali.
<%
Redupkan strXML
strXML = "<xml>"
objRecordset.MoveFirst
Lakukan Sementara BUKAN objRecordset.EOF
strXML = strXML & "<baris>"
Untuk Setiap varItem Di objRecordset.Fields
strXML = strXML _
& "<" & varItem.nama & ">" _
&varItem.nilai_
& "</" & varItem.nama & ">"
Berikutnya
strXML = strXML & "</baris>"
objRecordset.MoveNext
Lingkaran
strXML = strXML & "</xml>"
Setel objRecordset = Tidak Ada
%>
Metode yang lebih efektif adalah dengan langsung menggunakan metode penyimpanan bawaan dari kumpulan rekaman, yang secara otomatis dapat mengubah konten kumpulan rekaman ke dalam format XML. Setelah kita memanggil metode simpan, kita dapat segera melepaskan contoh objek kumpulan rekaman ke dalam memori. . Metode simpan memiliki dua parameter: satu adalah tempat penyimpanan XML, dan yang lainnya adalah indikator yang menunjukkan format penyimpanan data. Kita dapat menyimpan data sebagai objek XML DOM (objek ADO STREAM), atau langsung menyimpannya sebagai objek ASP RESPONSE, demi umum, kita menyimpannya sebagai DOM XML, dan menggunakan konstanta ADO adPersistXML untuk parameter kedua. . Begini caranya:
<%
Konstan iklanPersistXML = 1
Redupkan objekXMLDOM
Setel objXMLDOM = Server.CreateObject("MSXML2.DOMDocument.3.0")
objRecordset.simpan objXMLDOM, adPersistXML
Setel objRecordset = Tidak Ada
%>
Metode ini nyaman, cepat, dan bebas kesalahan. Tidak perlu mengubah nama node secara manual untuk kueri yang berbeda. Namun XML yang dihasilkan dengan cara ini kurang ringkas. Lihatlah hasil yang dihasilkannya:
<xml
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType
nama = "baris"
konten="eltHanya"
rs:CommandTimeout="30">
<s:Tipe Atribut
nama = "Nama Produk"
rs:angka="1"
rs:writeunknown="benar">
<s:tipe data
dt:ketik=”string”
dt:panjangmaks="40"
rs:maybenull="salah"/>
</s:Tipe Atribut>
<s:Tipe Atribut
nama = "Harga Satuan"
rs:angka = "2"
rs:nullable="benar"
rs:writeunknown="benar">
<s:tipe data
dt:ketik=”angka”
rs:dbtype="mata uang"
dt:panjangmaks="8"
rs:presisi="19"
rs:fixedlength="benar"/>
</s:Tipe Atribut>
<s:Tipe Atribut
nama = "Unit Dalam Stok"
rs:angka = "3"
rs:nullable="benar"
rs:writeunknown="benar">
<s:tipe data
dt:ketik="i2"
dt:panjangmaks="2"
rs:presisi="5"
rs:fixedlength="benar"/>
</s:AttributeType>
<s:extends type="rs:rowbase"/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row
Nama Produk = "Chai"
Harga Satuan="18"
UnitsInStock="39"/>
<z:baris
Nama Produk="Konbu"
Harga Satuan = "6"
UnitsInStock="24"/>
<z:baris
Nama Produk="Tahu"
Harga Satuan = "23.25"
UnitsInStock="35"/>
</rs:data>
</xml>
XML yang dibuat secara otomatis oleh ADO berisi informasi skema, yang menjelaskan node dan atribut apa yang diperbolehkan dalam XML ini dan tipe data apa yang digunakan, serta node data apa yang digunakan. juga meningkatkan namespace. Informasi skema mungkin berguna ketika validasi data diperlukan atau untuk pemrosesan yang lebih kompleks, namun, dalam banyak kasus, kami menggunakan klien tipis dan kami tidak memerlukan informasi skema. Kita dapat menggunakan XSLT untuk memisahkan informasi yang kita inginkan dan menghapus informasi yang berlebihan. Oleh karena itu, kami menulis "DataCleaner.xsl" berikut:
<?xml versi="1.0"?>
<xsl:stylesheet versi="1.0"
xmlns:xsl=" http://www.w3.org/1999/XSL/Transform "
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<xsl:output menghilangkan-xml-declaration="ya"/>
<xsl:templat pertandingan="/">
<xsl:nama elemen="xml">
<xsl:untuk setiap pilih="/xml/rs:data/z:baris">
<xsl:nama elemen="baris">
<xsl:untuk setiap pilih="@*">
<xsl:nama elemen="{nama()}">
<xsl:nilai-dari pilih="."/>
</xsl:elemen>
</xsl:untuk masing-masing>
</xsl:elemen>
</xsl:untuk masing-masing>
</xsl:elemen>
</xsl:templat>
</xsl:lembar gaya>
XSLT ini memiliki fitur yang dapat digunakan kembali dan berlaku untuk hasil kueri yang berbeda. Berikut adalah contoh cara menggunakan XSLT ini:
<%
Redupkan strCleanXML, objXMLDOM_XSLT
Setel objXMLDOM_XSLT = CreateObject("MSXML2.DOMDocument")
objXMLDOM_XSLT.load(Server.MapPath("DataCleaner.xsl"))
strCleanXML = objXMLDOM.transformNode(objXMLDOM_XSLT)
Setel objXMLDOM = Tidak Ada
Setel objXMLDOM_XSLT = Tidak Ada
%>
Setelah pemrosesan di atas, strClaenXML adalah string XML yang kita inginkan.
<xml>
<baris>
<NamaProduk>Chai</NamaProduk>
<Harga Satuan>18</Harga Satuan>
<UnitsInStock>39</UnitsInStock>
</baris>
<baris>
<NamaProduk>Konbu</NamaProduk>
<Harga Satuan>6</Harga Satuan>
<UnitsInStock>24</UnitsInStock>
</baris>
</xml>
String XML dalam format di atas adalah gaya kumpulan node yang sering kita lihat. Jika Anda tidak ingin memproses field menjadi node, tetapi memprosesnya menjadi node atribut, maka kita hanya perlu melakukan sedikit perubahan pada DataCleaber. xsl:
<?xml versi="1.0"?>
<xsl:stylesheet versi="1.0"
xmlns:xsl=" http://www.w3.org/1999/XSL/Transform "
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<xsl:output menghilangkan-xml-declaration="ya"/>
<xsl:templat pertandingan="/">
<xsl:nama elemen="xml">
<xsl:untuk setiap pilih="/xml/rs:data/z:baris">
<xsl:nama elemen="baris">
<xsl:untuk setiap pilih="@*">
<xsl:nama atribut="{nama()}">
<xsl:nilai-dari pilih="."/>
</xsl:atribut>
</xsl:untuk masing-masing>
</xsl:elemen>
</xsl:untuk masing-masing>
</xsl:elemen>
</xsl:templat>
</xsl:lembar gaya>
Berikut ini adalah hasil penggunaan gaya baru, yang jauh lebih pendek dibandingkan menggunakan node untuk merepresentasikan panjang bidang. Kecepatan transfer akan lebih cepat:
<xml>
<baris ProductName="Chai" UnitPrice="18" UnitsInStock="39"/>
<baris ProductName="Konbu" UnitPrice="6" UnitsInStock="24"/>
</xml>
Sejauh ini, kami telah memperkenalkan beberapa cara untuk mendapatkan data format XML dari kumpulan catatan ADO, dan kami juga telah memperoleh string yang paling disederhanakan. Namun ada beberapa masalah yang tetap perlu Anda perhatikan. Beberapa nilai bidang memiliki karakter yang tidak didukung dalam XML, seperti: "'< >&, seperti nama P&G Procter & Gamble, nama dari Produk Gumbo Mix milik Chef Anton, dll. Anda harus melakukan ini saat mengonversi. Lakukan proses pengkodean. Ada masalah yang perlu diperhatikan saat menggunakan metode penyimpanan di Microsoft ADO 2.6 SDK: 1. Metode penyimpanan hanya berfungsi pada Recordset terbuka; dengan bidang tipe adVariant, adIDispatch, dan adIUnknown tidak didukung. savw; 3. Ada dua batasan saat menyimpan kumpulan data hierarki (bentuk data): parameterisasi dan kumpulan data yang berisi pembaruan yang belum terselesaikan tidak dapat disimpan.
Untuk lebih meningkatkan kinerja, Anda dapat memasukkan pekerjaan konversi ke dalam komponen COM/COM+, dan kode ASP hanya melakukan presentasi akhir data. Pisahkan lapisan bisnis, lapisan data, dan lapisan presentasi. ASP hanya perlu memanggil komponen data. Komponen data memanggil prosedur tersimpan database, mengubah hasilnya menjadi XML, dan terakhir hanya merangkai string XML sederhana kembali ke program ASP. , dan ASP dapat Menggunakan XSLT untuk mengonversi XML dan mengirimkan hasilnya ke browser.