3 World Wide Web Consortium
2.2.2. Định hướng qua tài liệu XML để rút trích dữ liệu:
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 đữ liệu nào cần thiết cho ứng dụng của mình. Ví dụ như nếu nút đó là ProdwctName
chúng ta sẽ đọc và hiển thị thông tin trên một listbox, cụ thể như sau:
while (myRdr.Read()) { 1£ (Xm1NoteType.El1ement) { i£ (myRdr.Name="ProductName") { myRdr.. Read () ;
1stProducts. Ttems .Add (myRdr .ReadString) ;
}
myRdr.Close();
SVTH: Nguyễn Thị Kim Phượng GVHD: Th.S Nguyễn Trần Minh Thư
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 đùng để hiển thị
đữ liệu văn bản.
Lớp XmMHDafaDocument kế thừa từ lớp XmlDocumemt, vì thế nó cũng có một số phương thức như lớp XmlDocwmem. Điều thú vị nhất của XmIDafaDocumenf là nó cung cấp hai cách nhìn trên cùng một đữ liệu đó là
XML view và relational view.
XmIDafaDocumenf có một thuộc tính tên là DzfaSer, thông qua DafaSet, XmlIDafaDocumenf 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 Loađ()
để tải một đối tượng XmDafaDocuwer, 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 XME khi sử dụng XmIDafaDocument.
mm trong CSDL 5 Hình 2-1: Mô hình DOM
SVTH: Nguyễn Thị Kim Phượng GVHD: Th.S Nguyễn Trần Minh Thư
2.2.3. Truy vấn dữ liệu XML sử dụng XPathDocument và XPathNavigator và XPathNavigator
Việc sử dụng lớp XimlDocument và XmlDafaDocument đễ xử lý tài liệu
XML cũng có một vài hạn chế. Đầu tiên, toà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 XPafhDocwment và
XPathNavigator.
Lớp XPathDocumenf cho phép chúng ta xử lý dữ liệu XML mà không phải tải lên toàn bộ cây. Và XPafh/Navigaror sử dụng đề thao tác trên dữ liệu của XPathDocumeni. Nó cũng được sử đụng để thao tác trên XmJDocument,
và XmlIDatfaDocumen. 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 XParh.
XPath chỉ ra cú pháp "truy vấn cho việc rút trích đữ 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 XPøh 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. Chỉ tiết về cú pháp của XPazh 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 XPzrh. 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.xmi. <?xml version="1.0" encoding="utf-8" ?> <Bank> <Account>
SVTH: Nguyễn Thị Kim Phượng GVHD: Th.S Nguyễn Trần Minh Thư
<AccountNo>A1112</AccountNo> <NÑame>Pepsi Beagle</Name> <Balance>1200.89</Balance> <S§tate>OH</State> </Account> <Account> <AccountNo>A7833</AccountNo> <Ñame>Erank Horton</Name> <Balance>8964.55</Balance> <S§tate>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 đạ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 Accourft củ 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]
SVTH: Nguyễn Thị Kim Phượng GVHD: Th.S Nguyễn Trần Minh Thư
" 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 XPzh như thế nào, kế tiếp chúng ta sẽ đi vào sử dụng XPa#iDocumenf. 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ẽ mỉnh hoạ cách tìm kiếm đữ
liệu thông qua XPa£hDocument.
2.2.3.2. Cách sử dụng XPathDocument và XPathNavigator
Đầu tiên, chúng ta lơáđ tài liệu XML sử dụng XPathDocument như sau:
XPathDocument doc = new
XPathDocument (Server .MapPath ("Bank2.xm1") ) ;
Chúng ta cần hai đối tượng: XPøfhNavigaror đề rút trích ra tập hợp nút mà chúng ta muốn lấy, và XPahNodelferator đề 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();
XPathNodeTterator myIter = new XPathNodeTterator();
myTter=myNav.. Select ("Bank/Account [chi1d: : 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ó Sfae=°OH”. Để lẫy giá trị bên trong nút
SVTH: Nguyễn Thị Kim Phượng GVHD: Th.S Nguyễn Trần Minh Thư
Name, chúng ta sử dụng Current.Value của đối tượng Ierafor. Cụ thể như
sau:
while (myTter.MoveNext ())
{
1stName.. Ttems .Add (myTter.Current.Value) ;
2.2.3.3. Cách sử dụng XPathDocument và XPathNavigator cho việc định hướng tài liệu
Phần này minh họa cách tìm kiếm một XPáfhĐocument sử dụng giá trị của một thuộc tính và giá trị của một phần tử (element). Sử dụng tài liệu XML bank2.xmÏ sau: <Bank> <Account AccountNo="A1112"> <Name>Pepsi Beagle</Name> <Balance>1200.89</Balance> <State>OH</State> </Account> </Bank>
Để tìm kiếm giá trị cụ thể của một thuộc tính, chúng ta sử đụng biểu thức
như sau
Bank/Account[@AccountNo=' "+accNo+"'] /Balance