Tải bản đầy đủ (.pdf) (16 trang)

Tài liệu Thao tác trên XML part 8 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (182.17 KB, 16 trang )


XML và ADO.NET
XML là lớp kết nối giữa ADO.NET với phần còn lại của thế giới. ADO.NET được thiết
kế từ sự có phát triển của việc sử dụng môi trường XML. XML được sử dụng để truyền
dữ liệu trừ nơi lưu trữ vào ứng dụng hoặc trang web. Từ khi ADO.NET sử dụng XML
như là môi trường truyền tải, dữ liệu có thể trao đổi giữa ứ
ng dụng và hệ thống nó không
chỉ xảy ra trong ADO.NET. Bởi sự quan trọng của XML trong ADO.NET, có một vài
đặc tính mạnh mẽ trong ADO.NET cho phép đọc và ghi các tài liệu XML. Không gian
tên System.Xml cũng chứa các lớp có thể hủy và sử dụng dữ liệu quan hệ ADO.NET.

Chuyển dữ liệu ADO.NET thành XML
Trong ví dụ đầu tiên chúng ta sẽ xem xét cách dùng ADO.NET, streams, và XML để
"pull" một vài dữ liệu từ cơ sở dữ liệu Northwind vào một DataSet, load một đối tượng
XmlDocument với XML từ DataSet, và load XML vào môt listbox.
Để chạy ứng dụng
chúng ta cần chèn các câu lệnh using sau:
using System.Data;
using System.Xml;
using System.Data.SqlClient;
using System.IO;
Nếu sử dụng XmlDocument, chúng ta cũng cần phải thêm dòng sau:
private XmlDocument doc = new XmlDocument();
Các ví dụ ADO.NET thường có thêm một DataGrid trong forms. Nó cho phép chúng ta
thấy dữ liệu trong ADO.NET DataSet. Đây là mã cho ví dụ đầu tiên, mã có thể được tìm
thấy trong thư mục ADOSample1
:
private void button1_Click(object sender, System.EventArgs e)
{
//create a dataset
DataSet ds = new DataSet("XMLProducts");


//connect to the northwind database and
//select all of the rows from products table
//make sure your login matches your version of SqlServer
SqlConnection conn = new SqlConnection
(@"server=GLYNNJ_CS\NetSDK;uid=sa;pwd=;database=northwind");
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Products",conn);
Sau khi chúng ta tạo SqlDataAdapter, da, và DataSet, ds, chúng ta tạo một đối tượng
MemoryStream, một đối tượng StreamReader, và một đối tượng StreamWriter. Các đối
tượng StreamReader và StreamWriter se sử dụng MemoryStream đê di chuyển trong
XML:
MemoryStream memStrm=new MemoryStream();
StreamReader strmRead=new StreamReader(memStrm);
StreamWriter strmWrite=new StreamWriter(memStrm);
Chúng ta sẽ dùng một MemoryStream vì vậy không thể ghi bất kì cái ghi lên đĩa, tất
nhiên, chúng ta có thể sử dụng bất kì đối tượng này xuất phát từ lớp Stream như
FileStream. Tiếp theo, chúng ta điền DataSet và kết nối nó với DataGrid. Dữ liệu trong
DataSet bây giờ được hiển thị trong DataGrid:
da.Fill(ds,"products");
//load data into DataGrid
dataGrid1.DataSource=ds;
dataGrid1.DataMember="products";
Bước tiếp theo là phát ra XML. Chúng ta gọi phương thức WriteXml() từ lớp DataSet.
Phương thức này phát ra một tài liệu XML. Có hai quá tải của phương thức WriteXml():
một cần một chuỗi chứa tên và đường dẫn của file, một cái khác cần mọt tham số mode.
Mode này là một kiểu liệt kê XmlWriteMode, có các giá trị sau:

IgnoreSchema

WriteSchema


DiffGram
IgnoreSchema được dùng nếu bạn không muốn WriteXml() ghi một inline schema vào
đầu file XML; dùng tham số WriteSchema nếu bạn muốn như vậy. Chúng ta sẽ xem xét
DiffGrams ở phần sau.
ds.WriteXml(strmWrite,XmlWriteMode.IgnoreSchema);
memStrm.Seek(0,SeekOrigin.Begin);
//read from the memory stream to an XmlDocument object
doc.Load(strmRead);
//get all of the products elements
XmlNodeList nodeLst=doc.GetElementsByTagName("ProductName");
//load them into the list box
foreach(XmlNode nd in nodeLst)
listBox1.Items.Add(nd.InnerText);
}
private void listBox1_SelectedIndexChanged(object sender,
System.EventArgs e)
{
//when you click on the listbox,
//a message box appears with the unit price
string srch="XMLProducts/products[ProductName=" +
'"'+ listBox1.SelectedItem.ToString() + '"' + "]";
XmlNode foundNode=doc.SelectSingleNode(srch);
if(foundNode!=null)
MessageBox.Show(foundNode.SelectSingleNode("UnitPrice").InnerText);
else
MessageBox.Show("Not found");
}
Đây là màn hình, bạn có thể nhìn thấy kết quả trong danh sách cũng như trong DataGrid:

Nếu bạn chỉ muốn schema, bạn có thể gọi WriteXmlSchema() thay vì WriteXml().

Phương thức này có bốn quá. Một cần một chuỗi, với đường dẫn và tên của file XML.
Quá tải thứ hai sử dụng một đối tượng xuất phát từ lớp XmlWriter. Quá tải thứ ba sử
dụng mọt đối tượng xuất phát từ lớp TextWriter. Quá tải thứ
tư được sử dụng trong ví dụ.
Ngoài ra, nếu bạn muốn có phép ghi tài liệu XML lên đĩa, bạn có thể làm như sau:
string file = "c:\\test\\product.xml";
ds.WriteXml(file);
Nó cho phép ghi tài liệu XML lên đĩa để có thể đọc bởi các luồng khách, hoặc bởi
DataSet, hoặc sử dụng một ứng dụng khác, một trang web khác. Khi tham sô XmlMode
không được chỉ định, XmlDocument phải chứa một schema. Trong ví dụ của chúng ta
dùng stream như là một tham số cho phương thức XmlDocument.Load().
Khi XmlDocument được chuẩn bị, chúng ta load listbox bằng câu lệnh XPath như chúng
ta đã làm. Nếu xem xét kĩ, bạn sẽ thấy rằng chúng ta có thay đổi nhỏ trong sự kiện
listBox1_SelectedIndexChanged(). Thay vì chr ra thành phần InnerText, chúngt ta thực
một tìm kiếm XPath khác sử dụng SelectSingleNode() để lấy thành phần UnitPrice
element. Giờ đây mỗi khi bạn click lên một sản phẩm trong listbox, mộ
t MessageBox
xuất hiện với UnitPrice. Chúng ta có hai thể hiện của dữ liệu, nhưng quan trọng hơn,
chúng ts có thể thao tác trên dữ liệu theo hai kiểu khác nhau. Chúng ta có thể dùng không
gian tên System.Data để sử dụng dữ liệu hoặc cũng có thể dùng không gian tên
System.Xml. Nó có thể dẫn đến một vài thiết kế mềm dẻo cho các ứng dụng của bạn. Sử
dụng kết hợp ADO.NET và System.Xml là cách khôn ngoan nhất. Bạn có nhiều thể hiện
của cùng một d
ữ liệu, và cũng có nhiều cách để truy cập dữ liệu.
Trong ví dụ tiếp theo chúng ta sẽ đơn giản hóa quá trình sử lí bằng cách loại trừ ba
streams và một vài khả năng của ADO được xây dựng trong không gian tên System.Xml.
Chúng ta sẽ cần thay đổi mã:
private XmlDocument doc = new XmlDocument();
thành:
private XmlDataDocument doc;

Chúng ta cân nó bởi vì giờ đây chúng ta sẽ dùng XmlDataDocument. Đây là mã, có thể
tìm thấy trong thư mục ADOSample2
:
private void button1_Click(object sender, System.EventArgs e)
{
//create a dataset
DataSet ds=new DataSet("XMLProducts");
//connect to the northwind database and
//select all of the rows from products table
//make changes to connect string to match your login and server name
SqlConnection conn=new SqlConnection
(@"server=GLYNNJ_CS\NetSDK;uid=sa;pwd=;database=northwind");
SqlDataAdapter da=new SqlDataAdapter("SELECT * FROM products",conn);
//fill the dataset
da.Fill(ds,"products");
//load data into grid
dataGrid1.DataSource=ds;
dataGrid1.DataMember="products";
doc=new XmlDataDocument(ds);

//get all of the products elements

XmlNodeList nodeLst=doc.GetElementsByTagName("ProductName");

//load them into the list box
//we'll use a for loop this time

for(int ctr=0;ctr<nodeLst.Count;ctr++)
listBox1.Items.Add(nodeLst[ctr].InnerText);
}

Như bạn thấy, mã có thể load DataSet vào tài liệu XML một cách dễ dàng. Thay vì sử
dụng lớp XmlDocument, chúng ta sử dụng lớp XmlDataDocument. Lớp này được xây
dựng riền cho việc sử dụng dữ liệu trong đối tượng DataSet.
XmlDataDocument dựa trên lớp XmlDocument, vì nó có tất cả khả năng của lớp
XmlDocument. Khác biệt lớn nhất là XmlDataDocument có cấu trúc quá tải. Đừng quên
dòng mã tạo minh dụ cho XmlDataDocument (doc):
doc = new XmlDataDocument(ds);
Nó cần một tham số là DataSet đã được t
ạo, ds. Nó tạo tài liệu XML từ DataSet, và
không phải dùng phương thức Load(). Thật vậy, nếu bạn khởi tạo một đối tượng
XmlDataDocument mới mà không truyền cho nó một tham số DataSet, nó sẽ chứa một
DataSet với tên là NewDataSet, DataSet này không có DataTables trong tập hợp tables.
Các thuộc tính DataSet có thể được gán sau khi một đối tượng XmlDataDocument được
tạo ra.
Thêm vào dòng lệnh dau khi DataSet.Fill() được gọi:
ds.WriteXml("c:\\test\\sample.xml", XmlWriteMode.WriteSchema);
Trong trường hợp này, file XML sample.xml được tạo ra trong thư mục c:\test:
<?xml version="1.0" standalone="yes"?>
<XMLProducts>
<xs:schema id="XMLProducts" xmlns=""
xmlns:xs="
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="XMLProducts" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="products">
<xs:complexType>
<xs:sequence>
<xs:element name="ProductID" type="xs:int"
minOccurs="0" />

<xs:element name="ProductName" type="xs:string"
minOccurs="0" />
<xs:element name="SupplierID" type="xs:int"
minOccurs="0" />
<xs:element name="CategoryID" type="xs:int"
minOccurs="0" />
<xs:element name="QuantityPerUnit" type="xs:string"
minOccurs="0" />
<xs:element name="UnitPrice" type="xs:decimal"
minOccurs="0" />
<xs:element name="UnitsInStock" type="xs:short"
minOccurs="0" />
<xs:element name="UnitsOnOrder" type="xs:short"
minOccurs="0" />
<xs:element name="ReorderLevel" type="xs:short"
minOccurs="0" />
<xs:element name="Discontinued" type="xs:boolean"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<products>
<ProductID>1</ProductID>
<ProductName>Chai</ProductName>
<SupplierID>1</SupplierID>
<CategoryID>1</CategoryID>

<QuantityPerUnit>10 boxes x 20 bags</QuantityPerUnit>
<UnitPrice>18</UnitPrice>
<UnitsInStock>39</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>10</ReorderLevel>
<Discontinued>false</Discontinued>
</products>

×