Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
166,9 KB
Nội dung
Sử dụng XPath XSLT NET Trong phần này, xem xét hỗ trợ cho XPath XSL Transforms (XSLT) NET Framework XPath hỗ trợ thông qua không gian tên System.Xml.XPath, XSLT hỗ trợ thơng qua khơng gian tên System.Xml.Xsl Lí xem xét hai lớp lớp XPathNavigator không gian tên System.XPath cung cấp cách thực tế để thực thi biến đổi XSL NET XPath ngôn ngữ truy vấn cho XML Bạn dùng XPath để chọn các yếu tố giá trị văn giá trị thuộc tính XSLT dụng để thay đổi tài liệu gốc sang tài liệu với cấu trúc kiểu khác Trước tiên xem xét System.XPath trình bày cách dùng lớp System.Xml.Xsl Khơng gian tên System.XPath Không gian tên System.XPath xây dựng dựa yếu tố tốc độ Nó cung cấp thể đọc cho tài liệu XML bạn, khơng có vấn đề soạn thảo Các lớp không gian xây dựng đẻ thực thi lặp nhanh lựa chon tài liệu XML trỏ Đây bảng liệt kê lớp System.XPath, giải thích ngắn hỗ trợ lớp: Class Name XPathDocument XPathNavigator XPathNodeIterator XPathExpression XPathException Description Một view tài liệu XML Chỉ đọc Cung cấp khả điều hướng cho XPathDocument Cung cấp khả truy xuất trực tiếp nút XPath trang bị nút Xpath Một biên dịch phương thức XPath Được dùng SelectNodes, SelectSingleNodes, Evaluate, Matches XPath exception class XPathDocument XPathDocument tương thích cho thao tác lớp XmlDocument Nếu bạn cần khả soạn thảo, XmlDocument lựa chọn bạn sử dụng ADO.NET, XmlDataDocument (chúng ta xem xét phần sau chương) Dĩ nhiên, cần thao tác nhanh bạn sử dụng XPathDocument Nó có bốn tải cho phép bạn một tài liệu XML từ file đường dẫn, đối tượng TextReader, đối tượng XmlReader đối tượng Stream-based XPathNavigator XPathNavigator chứa tât phương thức di chuyển, lựa chọn mà bạn cần Sau số phương thức định nghĩa lớp: Method Name MoveTo() MoveToAttribute() MoveToFirstAttribute() MoveToNextAttribute() MoveToFirst() MoveToLast() MoveToNext() MoveToPrevious() MoveToFirstChild() MoveToId() MoveToParent() MoveToRoot() Description Cần tham số XPathNavigator Di chuyển vị trí đến vị trí truyền XPathNavigator Di chuyển tới thuộc tính chọn Cần tên thuộc tính khơng gian làm tham số Di chuyển đến thuộc tính mục Trả giá trị true thành công Di chuyển đến thuộc tính mục Trả true thành công Di chuyển đến mẫu loại với mẫu Trả true thành công, ngược lại trả false Di chuyển đến mẫu cuối cùng loại với mẫu Trả true thành công Di chuyển đến mẫu loại với mẫu Trả true thành công Di chuyển đến mẫu trước loại với mẫu Trả true thành công Di chuyển đến mẫu mẫu Trả true thành công Di chuyển đếu mẫu có ID truyền qua tham số Nó cần sơ đồ tài liệu, kiểu liệu cho kiểu ID Di chuyển đến cha mẫu Trả true thành công Di chuyển nút gốc tài liệu Có vài phương thức Select() khác hỗ trợchọn tập nút để làm việc Tất phương thức Select() trả đối tượng XPathNodeIterator Ngồi sử dụng phương thức SelectAncestors() SelectChildren() Cả hai phương thức trả XPathNodeIterator Trong Select() cần tham số XPath, phương thức cần tham số XPathNodeType Bạn dùng XPathNavigator để lưu trữ file hệ thống Registry thay cho XPathDocument XPathNodeIterator XPathNodeIterator coi trang bị NodeList NodeSet XPath Đối tượng có ba thuộc tính hai phương thức: • • • • • Clone – Tạo copy Count – Số nút đối tượng XPathNodeIterator Current – Trả XPathNavigator trỏ đến nút CurrentPosition() – Trả số integer chứa vị trí MoveNext() – Di chuyển đến nút thường thấy biểu thức XPath dùng để tạo XpathNodeIterator Sử dụng lớp không gian tên XPath Các tốt để cách làm việc ví dụ thơng qua ví dụ Hãy load tài liệu books.xml xem qua chúng bạn thấy định hướng công việc Trước tiên, tạo tham chiếu đến không gian tên System.Xml.Xsl System.Xml.XPath: using System.Xml.XPath; using System.Xml.Xsl; Trong ví dụ sử dụng file booksxpath.xml Nó giống books.xml mà dùng, ngoại trừ có hai quyến sách thêm vào Bạn tìm thấy mã nguồn 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 phương thức button1_Click() tạo XPathDocument (gọi doc), truyền cho đường dẫn đến tài liệu mà bạn muốn mở Trong dòng tạo XPathNavigator: XPathNavigator nav = doc.CreateNavigator(); Trong ví dụ này, sử dụng phương thức Select() để lấy nút có thuộc tính loại novel (tiểu thuyết) Sau sử dụng phương thức MoveNext() để duyệt qua tiểu thuyết danh mục sách Để load liệu vào listbox, sử dụng thuộc tính XPathNodeIterator.Current Nó tạo đối tượng XPathNavigator dựa nút mà XPathNodeIterator trỏ đến Trong trường hợp này, tạo XPathNavigator cho mục sách tài liệu Phương thức LoadBook() nhận XPathNavigator tạo XPathNodeIterator khác cách phát kiểu khác phương thức select, phương thức SelectDescendants() Nó cho XPathNodeIterator nút nút nút mục sách mà truyền cho phương thức LoadBook() Sau tạo vịng lặp MoveNext() khác XPathNodeIterator load thành phần tên giá trị vào listbox Đây hình sau chạy mã Nhớ có tiểu thuyết liệt kê: Nếu muốn thêm giá cho sách phải làm sao? XPathNavigator cung cấp phương thức Evaluate() để hỗ trợ thao tác kiểu Evaluate() có ba tải Phương thức thứ chứa chuỗi mà hàm XPath gọi Phương thức thứ hai sử dụng tham số đối tượng XPathExpression, phương thức thứ ba sử dụng tham số XPathExpression XPathNodeIterator Các thay đổi in đậm (mã tìm thấy 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ờ, listbox có giá sách: Không gian tên System.Xml.Xsl Không gian tên System.Xml.Xsl chứa lớp NET Framework sử dụng để hỗ trợ biến đổi XSL Không gian tham chiếu sẵn lưu trữ có thực thi giao diện IXPathNavigable.Trong NET Framework, sẵn chứa XmlDocument, XmlDataDocument, XPathDocument Một lần XPath cách lưu trữ khôn ngoan Nếu bạn muốn tạo lưu trữ tùy chọn, file hệ thống, bạn muốn thay đổi, bảo đảm lớp bạn thực thi giao diện IXPathNavigable XSLT dựa mơ hình kéo Bởi vậy, bạn gọp thay đổi khác lại Nếu muốn bạn áp dụng reader tùy chọn biến đổi Nó cho tạo khả mềm dẻo thiết kế Biến đổi XML Ví dụ mà xem xét lấy tài liệu books.xml thể dạng HTML ví dụ sử dụng file XSLT: books.xsl (mã tìm thấy thư mục XPathXSLSample3.) Chúng ta phải thêm dòng using sau: using System.IO; using System.Xml.Xsl; using System.Xml.XPath; Đây mã thực thi: private void button1_Click(object sender, System.EventArgs e) { //create the new XPathDocument XPathDocument doc = new XPathDocument(" \\ \\ \\booksxpath.xml"); //create a new XslTransForm XslTransform transForm = new XslTransform(); transForm.Load(" \\ \\ \\books.xsl"); //this FileStream will be our output FileStream fs=new FileStream(" \\ \\ \\booklist.html", FileMode.Create); //Create the navigator XPathNavigator nav = doc.CreateNavigator(); //Do the transform The output file is created here transForm.Transform(nav, null, fs); } Chúng ta tạo đối tượng xuất phát từ XPathDocument đối tượng xuất phát từ XslTransform Load file booksxpath.xml vào XPathDocument, books.xsl vào XslTransform Trong ví dụ này, tạo đối tượng FileStream để ghi tài liệu HTML lên đĩa Nếu ứng dụng ASP.NET, dùng đối tượng TextWriter truyền cho đối tượng HttpResponse Nếu thay đổi tài liệu XML khác, dùng đối tượng XmlWriter Sau chuẩn bị đối tượng XPathDocument XslTransform, tạo XPathNavigator XPathDocument, truyền XPathNavigator FileStream cho phương thức Transform() đối tượng XslTransform Transform() có vài tải, truyền kến nối điều hướng, XsltArgumentList (trình bày sau), Và IO streams Tham số hướng XPathNavigator, đối tượng thực thi giao diện IXPathNavigable IO streams TextWriter, Stream, đối tượng XmlWriter Tài liệu books.xsl giống sau: Price List Sử dụng XsltArgumentList Chúng ta sớm đề cập đến XsltArgumentList Đây cách bạn kết nối đối tượng với phương thức không gian tên Khi hồn tất, bạn có thẻ triệu gọi phương thức q trình biến đổi Hãy xem ví dụ cách hoạt động chúng (mã tìm thấy XPathXSLSample4) private void button1_Click(object sender, System.EventArgs e) { //new XPathDocument XPathDocument doc=new XPathDocument(" \\ \\ \\booksxpath.xml"); //new XslTransform XslTransform transForm=new XslTransform(); transForm.Load(" \\ \\ \\booksarg.xsl"); //new XmlTextWriter since we are creating a new XML document XmlWriter xw=new XmlTextWriter(" \\ \\ \\argSample.xml",null); //create the XsltArgumentList and new BookUtils object XsltArgumentList argBook=new XsltArgumentList(); BookUtils bu=new BookUtils(); //this tells the argumentlist about BookUtils argBook.AddExtensionObject("urn:ProCSharp",bu); //new XPathNavigator XPathNavigator nav=doc.CreateNavigator(); //do the transform transForm.Transform(nav,argBook,xw); xw.Close(); } //simple test class public class BookUtils { public BookUtils(){} public string ShowText() { return "This came from the ShowText method!"; } } Đây file biến đổi (argSample.xml): The Autobiography of Benjamin Franklin This came from the ShowText method! The Confidence Man This came from the ShowText method! The Gorgias This came from the ShowText method! The Great Cookie Caper This came from the ShowText method! A Really Great Book This came from the ShowText method! Trong ví dụ này, định nghĩa lớp mới, BookUtils Trong lớp có phương thức trả chuỗi "This came from the ShowText method!" Trong kiện button1_Click(), tạo XPathDocument XslTransform làm với hai ngoại lệ Trong lúc tạo tài liệu XML, dùng XmlWriter thay cho FileStream mà dùng Các thay đổi khác: XsltArgumentList argBook=new XsltArgumentList(); BookUtils bu=new BookUtils(); argBook.AddExtensionObject("urn:ProCSharp",bu); Chúng ta tạo XsltArgumentList Chúng ta tạo thể đối tượng BookUtils,và gọi phương thức AddExtensionObject() Khi gọi Transform(), truyền đối tượng XsltArgumentList (argBook) với XPathNavigator XmlWriter mà tạo Đây tài liệu booksarg.xsl: Hai dòng quan trọng in đậm Đầu tiên thêm không gian tên mà tạo thêm đối tượng XsltArgumentList Sau muốn gọi, sử dụng khơng gian kí hiệu chuẩn khơng gian tên XSLT Chúng ta cịn có cách khác sử dụng XSLT scripting Bạn nhúng mã C#, VB, JavaScript stylesheet Không giống thực thi phi NET kịch thực thi XslTransform.Load() gọi; cách thực thi kịch biên dịch, giống cách mà ASP.NET làm Hãy sửa đổi file XSLT theo cách Trước tiên thêm kịch vào stylesheet bạn thấy thay đổi booksscript.xsl đây: string ShowText() { return "This came from the ShowText method!"; } Chúng ta cài không gian tên scripting, thêm mã (đã biên dịch Visual Studio NET IDE), tạo lời gọi đến stylesheet File xuất giống hệt ví dụ Tóm lại, sử dụng XPathDocument bạn muốn soạn thảo, XmlDataDocument bạn muốn lấy liệu từ ADO.NET, XmlDocument bạn muốn thao tác liệu ... Hãy load tài liệu books .xml xem qua chúng bạn thấy định hướng công việc Trước tiên, tạo tham chiếu đến không gian tên System .Xml. Xsl System .Xml. XPath: using System .Xml. XPath; using System .Xml. Xsl;... XPathNavigator XmlWriter mà tạo Đây tài liệu booksarg.xsl: ... \\booksxpath .xml" ); //new XslTransform XslTransform transForm=new XslTransform(); transForm.Load(" \\ \\ \\booksarg.xsl"); //new XmlTextWriter since we are creating a new XML document XmlWriter xw=new XmlTextWriter("