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

Tài liệu Thao tác trên XML part 7 pdf

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 (166.9 KB, 12 trang )


Sử dụng XPath và XSLT trong .NET
Trong phần này, chúng ta sẽ xem xét hỗ trợ cho XPath và XSL Transforms (XSLT) trong
.NET Framework. XPath được hỗ trợ thông qua không gian tên System.Xml.XPath, và
XSLT được hỗ trợ thông qua không gian tên System.Xml.Xsl. Lí do xem xét cả hai lớp
trên là vì lớp XPathNavigator của không gian tên System.XPath cung cấp cách rất thực tế
để thực thi các biến đổi XSL trong .NET.
XPath là một ngôn ngữ truy vấn cho XML. Bạn sẽ dùng XPath để chọn một bộ con các
các yếu tố giá trị văn bản hoặc các giá trị thuộc tính. XSLT được dụng để thay đổi mộ
t tài
liệu gốc sang một tài liệu với một cấu trúc kiểu khác.
Trước tiên chúng ta sẽ xem xét System.XPath và trình bày cách dùng các lớp
System.Xml.Xsl.
Không gian tên System.XPath
Không gian tên System.XPath được xây dựng dựa trên yếu tố tốc độ. Nó cung cấp một
thể hiện chỉ đọc cho tài liệu XML của bạn, vì vậy không có vấn đề soạn thảo ở đây. Các
lớp trong không gian này được xây dựng đẻ thực thi lặp nhanh và lựa chon trên tài liệu
XML trong một con trỏ.
Đây là mộ
t bảng liệt kê các lớp trong System.XPath, và một giải thích ngắn vì hỗ trợ của
mỗi lớp:
Class Name Description
XPathDocument Một view của tài liệu XML . Chỉ đọc.
XPathNavigator Cung cấp khả năng điều hướng cho một XPathDocument.
XPathNodeIterator Cung cấp khả năng truy xuất trực tiếp các nút. XPath trang bị
một bộ nút trong Xpath.
XPathExpression Một biên dịch phương thức XPath. Được dùng bởi SelectNodes,
SelectSingleNodes, Evaluate, và Matches.
XPathException XPath exception class.
XPathDocument
XPathDocument tương thích cho bất kì thao tác nào của lớp XmlDocument. Nếu bạn cần


khả năng soạn thảo, XmlDocument được lựa chọn khi bạn sử dụng ADO.NET,
XmlDataDocument (chúng ta sẽ xem xét ở phần sau của chương). Dĩ nhiên, khi cần thao
tác nhanh bạn có thể sử dụng XPathDocument. Nó có bốn quá tải cho phép bạn một một
tài liệu XML từ một file và một đường dẫn, một đối tượng TextReader, một đối tượng
XmlReader hoặc một đối tượng Stream-based.
XPathNavigator
XPathNavigator chứa tât cả các phương thức di chuyển, lựa chọn mà bạn cần. Sau đây là
một số phương thức được định nghĩa trong lớp:
Method Name Description
MoveTo() Cần một tham số XPathNavigator. Di chuyển vị trí hiện tại
đến vị trí được truyền trong XPathNavigator.
MoveToAttribute() Di chuyển tới thuộc tính được chọn. Cần một tên thuộc tính
và không gian làm tham số.
MoveToFirstAttribute() Di chuyển đến thuộc tính đầu tiên của mục hiện tại. Trả về
giá trị true nếu thành công.
MoveToNextAttribute() Di chuyển đến thuộc tính tiếp theo của mục hiện tại. Trả về
true nếu thành công.
MoveToFirst() Di chuyển đến mẫu đầu tiên cùng loại với mẫu hiện tại. Trả
về true nếu thành công, ngược lại trả về false.
MoveToLast() Di chuyển đến mẫu cuối cùng cùng loại với mẫu hiện tại.
Trả về true nếu thành công.
MoveToNext() Di chuyển đến mẫu tiếp theo cùng loại với mẫu hiện tại. Trả
về true nếu thành công.
MoveToPrevious() Di chuyển đến mẫu trước cùng loại với mẫu hiện tại. Trả về
true nếu thành công.
MoveToFirstChild() Di chuyển đến mẫu con đầu tiên của mẫu hiện tại. Trả về
true nếu thành công.
MoveToId() Di chuyển đếu mẫu có ID được truyền qua tham số. Nó cần
một sơ đồ tài liệu, và một kiểu dữ liệu cho là kiểu của ID.
MoveToParent() Di chuyển đến cha của mẫu hiện tại. Trả về true nếu thành

công.
MoveToRoot() Di chuyển nếu nút gốc của tài liệu.
Có một vài phương thức Select() khác nhau hỗ trợchọn một tập các nút để làm việc. Tất
cả các phương thức Select() trả về một đối tượng XPathNodeIterator.
Ngoài ra có thể sử dụng các phương thức SelectAncestors() và SelectChildren(). Cả hai
phương thức đều trả về một XPathNodeIterator. Trong khi Select() cần một tham số
XPath, thì các phương thức này cần một tham số XPathNodeType.
Bạn có thể dùng XPathNavigator để lưu trữ như là một file hệ thống hoặc Registry thay
cho một XPathDocument.
XPathNodeIterator
XPathNodeIterator có thể coi là một trang bị NodeList hoặc một NodeSet trong XPath.
Đối tượng này có ba thuộc tính và hai phương thức:

Clone – Tạo một copy mới của chính nó

Count – Số các nút trong đối tượng XPathNodeIterator

Current – Trả về một XPathNavigator trỏ đến nút hiện tại

CurrentPosition() – Trả về một số integer chứa vị trí hiện tại

MoveNext() – Di chuyển đến nút tiếp theo thường thấy trong biểu thức XPath
dùng để tạo một XpathNodeIterator
Sử dụng các lớp trong không gian tên XPath
Các tốt nhất để chỉ ra cách làm việc của các ví dụ này là thông qua ví dụ. Hãy load tài
liệu books.xml xem qua chúng bạn sẽ thấy được định hướng của công việc. Trước tiên,
chúng ta tạo một tham chiếu đến các không gian tên System.Xml.Xsl và
System.Xml.XPath:
using System.Xml.XPath;
using System.Xml.Xsl;

Trong ví dụ này chúng ta sử dụng file booksxpath.xml. Nó giống như books.xml mà
chúng ta đã dùng, ngoại trừ có một hai quyến sách được thêm vào. Bạn có thể tìm thấy
mã nguồn trong thư mục XPathXSLSample1
:
private void button1_Click(object sender, System.EventArgs e)
{

//modify to match your path structure
XPathDocument doc=new XPathDocument("..\\..\\..\\booksxpath.xml");
//create the XPath navigator
XPathNavigator nav=doc.CreateNavigator();
//create the XPathNodeIterator of book nodes
// that have genre attribute value of novel
XPathNodeIterator iter=nav.Select("/bookstore/book[@genre='novel']");

while(iter.MoveNext())
{
LoadBook(iter.Current);
}
}

private void LoadBook(XPathNavigator lstNav)
{
//We are passed an XPathNavigator of a particular book node
//we will select all of the descendents and
//load the list box with the names and values

XPathNodeIterator iterBook=lstNav.SelectDescendants
(XPathNodeType.Element,false);
while(iterBook.MoveNext())

listBox1.Items.Add(iterBook.Current.Name + ": "
+ iterBook.Current.Value);
}
Đầu tiên trong phương thức button1_Click() chúng ta tạo một XPathDocument (gọi là
doc), và truyền cho nó đường dẫn đến tài liệu mà bạn muốn mở. Trong dòng tiếp theo
chúng ta tạo ra một XPathNavigator:
XPathNavigator nav = doc.CreateNavigator();
Trong ví dụ này, chúng ta sử dụng phương thức Select() để lấy bộ các nút có thuộc tính
loại là novel (tiểu thuyết). Sau đó chúng ta sử dụng phương thức MoveNext() để duyệt
qua các tiểu thuyết trong danh mục sách.
Để load dữ liệu vào một listbox, chúng ta sử dụng thuộc tính XPathNodeIterator.Current.
Nó s
ẽ tạo ra một đối tượng XPathNavigator mới dựa trên nút mà XPathNodeIterator đang
trỏ đến. Trong trường hợp này, chúng ta tạo một XPathNavigator cho một mục sách trong
tài liệu.
Phương thức LoadBook() nhận XPathNavigator này và tạo ra một XPathNodeIterator
khác bằng cách phát ra một kiểu khác của phương thức select, phương thức
SelectDescendants(). Nó sẽ cho chúng ta một XPathNodeIterator của các nút con và các
nút con của các nút con này của mục sách mà chúng ta đã truyền cho phương thức
LoadBook().
Sau đó chúng ta tạo một vòng lặp MoveNext() khác trên XPathNodeIterator và load các
thành phần tên và giá trị vào listbox.
Đây là màn hình sau khi chạy mã. Nhớ rằng ở đây chỉ có các tiểu thuyết mới được liệt kê:

Nếu muốn thêm giá cho những quyển sách này thì phải làm sao? XPathNavigator cung
cấp phương thức Evaluate() để hỗ trợ những thao tác kiểu như thế này. Evaluate() có ba
quá tải. Phương thức thứ nhất chứa một chuỗi mà hàm XPath gọi. Phương thức thứ hai sử
dụng một tham số đối tượng XPathExpression, phương thức thứ ba sử dụng các tham số
XPathExpression XPathNodeIterator. Các thay đổi được in đậm (mã có thể được tìm thấy
trong XPathXSLSample2

):
private void button1_Click(object sender, System.EventArgs e)
{
//modify to match your path structure
XPathDocument doc = new XPathDocument("..\\..\\..\\booksxpath.XML");
//create the XPath navigator
XPathNavigator nav = doc.CreateNavigator();
//create the XPathNodeIterator of book nodes
// that have genre attribute value of novel
XPathNodeIterator iter = nav.Select("/bookstore/book[@genre='novel']");
while(iter.MoveNext())
{
LoadBook(iter.Current.Clone());
}
//add a break line and calculate the sum
listBox1.Items.Add("========================");
listBox1.Items.Add("Total Cost = "
+ nav.Evaluate("sum(/bookstore/book[@genre='novel']/price)"));
}
Bây giờ, trong listbox có giá các quyển sách:

×