liệu:
2.2.2.1. Sử dụng lớp XMLTextReader
Trong phần trên, chúng ta đã biết cách để đọc vào một tài liệu XML, phần này chúng ta sẽ định hướng qua tài liệu XML và chỉ lấy những dữ liệu nào cần thiết cho ứng dụng của mình. Ví dụ như nếu nút đĩ là ProductName
chúng ta sẽđọc và hiển thị thơng tin trên một listbox, cụ thể như sau:
while (myRdr.Read()) {
if(XmlNoteType.Element) {
if (myRdr.Name="ProductName") {
myRdr.Read();
lstProducts.Items.Add(myRdr.ReadString); }
} }
Tìm hiểu cơng nghệ XML và xây dựng hệ thống quản lý dịch vụ khách hàng
2.2.2.2. Sử dụng mơ hình DOM
Một cây được tạo thành từ nhiều nút. Và một nút cũng là một cây chứa những nút khác. Nút lá thì khơng cĩ nút con, vì thế nút này dùng để hiển thị dữ liệu văn bản.
Lớp XmlDataDocument kế thừa từ lớp XmlDocument, vì thế nĩ cũng cĩ một số phương thức như lớp XmlDocument. Điều thú vị nhất của
XmlDataDocument là nĩ cung cấp hai cách nhìn trên cùng một dữ liệu đĩ là
XML view và relational view.
XmlDataDocument cĩ một thuộc tính tên là DataSet, thơng qua DataSet,
XmlDataDocument trình bày dữ liệu như một hoặc nhiều bảng (DataTable)
cĩ quan hệ hoặc khơng cĩ quan hệ. Khi chúng ta sử dụng phương thức Load() để tải một đối tượng XmlDataDocument, chúng ta cĩ thể xem nĩ như một cây hoặc như một bảng (hoặc nhiều bảng). Sau đây là hình minh hoạ cho hai cách nhìn về một tài liệu XML khi sử dụng XmlDataDocument.
Tìm hiểu cơng nghệ XML và xây dựng hệ thống quản lý dịch vụ khách hàng
2.2.3. Truy vấn dữ liệu XML sử dụng XPathDocument và XPathNavigator
Việc sử dụng lớp XmlDocument và XmlDataDocument để xử lý tài liệu XML cũng cĩ một vài hạn chế. Đầu tiên, tồn bộ tài liệu phải được lưu trong cache. Thêm vào đĩ, việc định hướng thơng qua một cây sẽ gặp nhiều khĩ khăn, và định hướng thơng qua những view quan hệ cũng khơng thuận tiện. Để khắc phục vấn đề này, VS.NET cung cấp lớp XPathDocument và
XPathNavigator.
Lớp XPathDocument cho phép chúng ta xử lý dữ liệu XML mà khơng
phải tải lên tồn bộ cây. Và XPathNavigator sử dụng để thao tác trên dữ liệu
của XPathDocument. Nĩ cũng được sử dụng để thao tác trên XmlDocument,
và XmlDataDocument. Nĩ hỗ trợ kỹ thuật định hướng cho việc chọn nút, lặp qua các nút đã chọn, và làm việc trên những nút đã chọn này. Để thực hiện được việc này, nĩ sử dụng biểu thức XPath.
XPath chỉ ra cú pháp truy vấn cho việc rút trích dữ liệu từ một tài liệu XML. Ý tưởng sử dụng tương tự như trong SQL, tuy nhiên cú pháp của nĩ thì khác biệt. Nĩi chung, cú pháp truy vấn XPath cĩ vẻ phức tạp. Tuy nhiên qua các ví dụ sau, Chúng ta cĩ thể thấy được sự ngắn gọn và hiệu quả trong việc rút trích dữ liệu XML. Chi tiết về cú pháp của XPath sẽ khơng đi sâu trong bài viết này vì nĩ nghiên về lĩnh vực khác. Tuy nhiên, chúng ta cũng minh họa vài cách sử dụng biểu thức XPath. Sau đây chúng ta xem qua ví dụ một tài liệu XML mà sẽ được sử dụng để thực hiện truy vấn trên đĩ. Tài liệu này đặt tên là bank1.xml.
<?xml version="1.0" encoding="utf-8" ?> <Bank>
Tìm hiểu cơng nghệ XML và xây dựng hệ thống quản lý dịch vụ khách hàng
<AccountNo>A1112</AccountNo> <Name>Pepsi Beagle</Name> <Balance>1200.89</Balance> <State>OH</State> </Account> ………… ………… <Account>
<AccountNo>A7833</AccountNo> <Name>Frank Horton</Name> <Balance>8964.55</Balance> <State>MI</State>
</Account> </Bank>
Ví dụ 1: Giả sử chúng ta muốn truy vấn tất cả tên của tài khoản. Biểu thức XPath như sau:
Dạng 1: descendant::Name
Dạng 2: Bank/Account/Name
Ý nghĩa của biếu thức dạng 1 là “ Hãy lấy những nút con của tất cả những nút cĩ tên là Name”, cịn dạng 2 được diễn đạt như sau “Lấy những nút Name của nút Account của nút Bank”. Cả hai biểu thức này đều trả về cùng một tập hợp nút như nhau. Ví dụ 2: Chúng ta muốn lấy tất cả khách hàng từ Ohio (OH). Biểu thức được viết như sau: Dạng 1: descendant::Account[child::State=‘OH’] Dạng 2: Bank/Account[child::State=‘OH’] Ví dụ 3: Lấy tất cả Account cĩ Balance>5000.00 Dạng 1: descendant::Account[child::Balance> 5000] Dạng 2: Bank/Account[child::Balance > 5000.00]
Tìm hiểu cơng nghệ XML và xây dựng hệ thống quản lý dịch vụ khách hàng
Ví dụ 4: Giả sử Chúng ta muốn lấy thơng tin của những Account mà cĩ tên bắt đầu bằng ký tự ‘D’
Dạng 1: descendant::account[starts-with(child::Name,‘D’)]
Dạng 2: Bank/Account[starts-with(child::Name,‘D’)]
Như vậy, sử dụng dạng nào là thích hợp. Điều đĩ phụ thuộc vào cảm giác của từng người và trên cấu trúc của tài liệu XML. Dạng 2 trơng dễ sử dụng hơn dạng 1. Tuy nhiên, trong những tài liệu XML lồng quá sâu, thì dạng 1 sẽ đưa ra một biểu thức hiệu quả hơn.
Trên đây, chúng ta đã biết khái niệm về cách sử dụng biểu thức XPath như thế nào, kế tiếp chúng ta sẽ đi vào sử dụng XPathDocument. Trong ngữ cảnh này, chúng ta sẽ đưa ra 2 ví dụ. Ví dụ đầu tiên sẽ lấy tất cả tên của khách hàng từ Ohio và hiển thị lên listbox. Ví dụ thứ hai sẽ minh hoạ cách tìm kiếm dữ liệu thơng qua XPathDocument.
2.2.3.2. Cách sử dụng XPathDocument và XPathNavigator
Đầu tiên, chúng ta load tài liệu XML sử dụng XPathDocument như sau:
XPathDocument doc = new
XPathDocument(Server.MapPath("Bank2.xml"));
Chúng ta cần hai đối tượng: XPathNavigatorđể rút trích ra tập hợp nút mà chúng ta muốn lấy, và XPathNodeIterator để lặp thơng qua tập hợp nút vừa lấy được. Khai báo như sau:
XPathNavigator myNav = new XPathNavigator(); myNav = myDoc.CreateNavigator();
XPathNodeIterator myIter = new XPathNodeIterator();
myIter=myNav.Select("Bank/Account[child::State='OH']/Name");
Biểu thức “Bank/Account[child::State=‘OH’]/Name” trả về những node tên Name từ tập nút Account cĩ State=”OH”. Để lấy giá trị bên trong nút