Thao tác trên XML part 7

Chia sẻ: Dqdsadasd Qwdasdsad | Ngày: | Loại File: PDF | Số trang:12

0
63
lượt xem
17
download

Thao tác trên XML part 7

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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.

Chủ đề:
Lưu

Nội dung Text: Thao tác trên XML part 7

  1. 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
  2. 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.
  3. 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);
  4. } } 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ê:
  5. 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:
  6. Không gian tên System.Xml.Xsl Không gian tên System.Xml.Xsl chứa các lớp được .NET Framework sử dụng để hỗ trợ các biến đổi XSL. Không gian được tham chiếu sẵn trong các lưu trữ có thực thi giao diện IXPathNavigable.Trong .NET Framework, sẵn chứa XmlDocument, XmlDataDocument, và XPathDocument. Một lần nữa XPath là cách lưu trữ khôn ngoan nhất. Nếu bạn muốn tạo một lưu trữ tùy chọn, như file hệ thống, và bạn muốn có thể thay đổi, hãy bảo đảm rằng lớp của bạn đã thực thi giao diện IXPathNavigable. XSLT dựa trên mô hình kéo. Bởi vậy, bạn có thể gọp các thay đổi khác nhau lại. Nếu muốn bạn có thể áp dụng một reader tùy chọn giữa các biến đổi. Nó cho tạo ra một khả năng mềm dẻo trong thiết kế. Biến đổi XML Ví dụ đầu tiên mà chúng ta xem xét lấy tài liệu books.xml và thể hiện dưới dạng HTML ví dụ sử dụng file XSLT: books.xsl. (mã có thể tìm thấy trong thư mục XPathXSLSample3.) Chúng ta phải thêm các dòng using sau: using System.IO; using System.Xml.Xsl; using System.Xml.XPath; Đây là 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
  7. 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 một đối tượng xuất phát từ XPathDocument và một đối tượng xuất phát từ XslTransform. Load file booksxpath.xml vào XPathDocument, và books.xsl vào XslTransform. Trong ví dụ này, chúng ta cũng tạo một đối tượng FileStream để ghi tài liệu HTML mới lên đĩa. Nếu đây là một ứng dụng ASP.NET, chúng ta có thể dùng một đối tượng TextWriter và truyền nó cho đối tượng HttpResponse. Nếu chúng ta đang thay đổi một tài liệu XML khác, chúng ta có thể dùng một đối tượng XmlWriter. Sau khi đã chuẩn bị các đối tượng XPathDocument và XslTransform, chúng ta tạo XPathNavigator trên XPathDocument, và truyền XPathNavigator và FileStream cho phương thức Transform() của đối tượng XslTransform. Transform() có một vài quá tải, truyền và kến nối các điều hướng, XsltArgumentList (trình bày sau), Và IO streams. Tham số đều hướng có thể là XPathNavigator, hoặc bất kì đối tượng nào thực thi giao diện IXPathNavigable. IO streams có thể là một TextWriter, Stream, hoặc một đối tượng XmlWriter. Tài liệu books.xsl giống như sau: Price List
  8. Sử dụng XsltArgumentList Chúng ta đã sớm đề cập đến XsltArgumentList. Đây là cách bạn kết nối một đối tượng với các phương thức và một không gian tên. Khi hoàn tất, bạn có thẻ triệu gọi các phương thức trong quá trình biến đổi. Hãy xem ví dụ dưới đây và chỉ ra cách hoạt động của chúng (mã có thể tìm thấy trong 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);
  9. xw.Close(); } //simple test class public class BookUtils { public BookUtils(){} public string ShowText() { return "This came from the ShowText method!"; } } Đây là 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, chúng ta định nghĩa một lớp mới, BookUtils. Trong lớp này chúng ta có một phương thức chỉ trả về chuỗi "This came from the ShowText method!". Trong sự
  10. kiện button1_Click(), chúng ta tạo ra XPathDocument và XslTransform như chúng ta đã từng làm với hai ngoại lệ. Trong lúc chúng ta tạo một tài liệu XML, vì thế chúng ta dùng XmlWriter thay cho FileStream mà chúng ta đã từng 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 một XsltArgumentList. Chúng ta tạo một thể hiện của đối tượng BookUtils,và gọi phương thức AddExtensionObject(). Khi gọi Transform(), chúng ta truyền trong các đối tượng XsltArgumentList (argBook) với XPathNavigator và XmlWriter mà chúng ta đã tạo. Đây là tài liệu booksarg.xsl:
  11. Hai dòng quan trọng được in đậm. Đầu tiên chúng ta thêm không gian tên mà chúng ta đã tạo khi thêm đối tượng XsltArgumentList. Sau đó khi muốn gọi, chúng ta sử dụng không gian các kí hiệu chuẩn trong không gian tên XSLT . Chúng ta còn có một cách khác đó là sử dụng XSLT scripting. Bạn có thể nhúng mã C#, VB, và JavaScript trong một stylesheet. Không giống như thực thi phi .NET kịch bản sẽ được thực thi khi XslTransform.Load() được gọi; cách này thực thi các kịch bản đã được biên dịch, giống như cách mà ASP.NET làm. Hãy sửa đổi file XSLT trên theo cách này. Trước tiên chúng ta thêm kịch bản vào stylesheet. bạn có thể thấy các thay đổi trong booksscript.xsl dưới đây: string ShowText() { return "This came from the ShowText method!"; }
  12. Chúng ta cài không gian tên scripting, và thêm mã (đã được biên dịch bởi Visual Studio .NET IDE), và tạo một lời gọi đến stylesheet. File xuất giống hệt ví dụ trên. Tóm lại, sử dụng XPathDocument nếu bạn muốn soạn thảo, XmlDataDocument nếu bạn muốn lấy dữ liệu từ ADO.NET, và XmlDocument nếu bạn muốn có thể thao tác dữ liệu.
Đồng bộ tài khoản