XML phần 2

Chia sẻ: Nghia Bui Tuan | Ngày: | Loại File: PDF | Số trang:10

0
63
lượt xem
8
download

XML phần 2

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

Tài liệu được tạo ra trông giống như sau: Gourmet Coffee 0.99 Blue China Tea Pot 102.99

Chủ đề:
Lưu

Nội dung Text: XML phần 2

  1. Tài liệu được tạo ra trông giống như sau: Gourmet Coffee 0.99 Blue China Tea Pot 102.99 1.1 Chèn thêm nút vào tài liệu XML một cách nhanh chóng Bạn cần chèn thêm nút vào một tài liệu XML mà không phải dùng đến mã lệnh dài dòng. Viết các phương thức trợ giúp (nhận vào tên thẻ và nội dung của nút) để chèn nút vào tài liệu XML. Cách khác, sử dụng phương thức XmlDocument.CloneNode để sao lại các nhánh của một XmlDocument. Chèn một nút vào XmlDocument cần nhiều mã lệnh. Có nhiều cách thu ngắn mã lệnh này. Một cách là tạo một lớp trợ giúp (helper) gồm các phương thức mức-cao để chèn nút vào tài liệu. Ví dụ, bạn có thể viết phương thức AddElement để tạo một phần tử mới, chèn nó vào, và thêm text (đây là ba thao tác cần thiết khi chèn phần tử). Ví dụ dưới đây là một lớp trợ giúp như thế: using System; using System.Xml; public class XmlHelper { public static XmlNode AddElement(string tagName, string textContent, XmlNode parent) { XmlNode node = parent.OwnerDocument.CreateElement(tagName); parent.AppendChild(node); if (textContent != null) { XmlNode content;
  2. content = parent.OwnerDocument.CreateTextNode(textContent); node.AppendChild(content); } return node; } public static XmlNode AddAttribute(string attributeName, string textContent, XmlNode parent) { XmlAttribute attribute; attribute = parent.OwnerDocument.CreateAttribute(attributeName); attribute.Value = textContent; parent.Attributes.Append(attribute); return attribute; } } Bây giờ bạn có thể viết mã lệnh để tạo một tài liệu XML (giống mục 5.2) với cú pháp đơn giản hơn như sau: public class GenerateXml { private static void Main() { // Tạo tài liệu. XmlDocument doc = new XmlDocument(); XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); doc.AppendChild(docNode); XmlNode products = doc.CreateElement("products"); doc.AppendChild(products); // Thêm hai product. XmlNode product = XmlHelper.AddElement("product", null, products); XmlHelper.AddAttribute("id", "1001", product); XmlHelper.AddElement("productName", "Gourmet Coffee", product); XmlHelper.AddElement("productPrice", "0.99", product); product = XmlHelper.AddElement("product", null, products); XmlHelper.AddAttribute("id", "1002", product);
  3. XmlHelper.AddElement("productName", "Blue China Tea Pot", product); XmlHelper.AddElement("productPrice", "102.99", product); // Lưu tài liệu. doc.Save(Console.Out); Console.ReadLine(); } } Bạn cũng có thể lấy các phương thức trợ giúp (như AddAttribute và AddElement) làm các phương thức thể hiện trong một lớp tùy biến dẫn xuất từ XmlDocument. Một cách khác để đơn giản hóa việc viết XML là sao lại các nút bằng phương thức XmlNode.CloneNode. Phương thức này nhận một đối số luận lý. Nếu giá trị này là true, CloneNode sẽ sao lại toàn bộ nhánh, với tất cả các nút lồng bên trong. Ví dụ dưới đây tạo một nút product mới bằng cách sao lại nút đầu tiên: // (Thêm nút product đầu tiên.) // Tạo một product mới dựa vào product hiện có. product = product.CloneNode(true); // Điều chỉnh dữ liệu. product.Attributes[0].Value = "1002"; product.ChildNodes[0].ChildNodes[0].Value = "Blue China Tea Pot"; product.ChildNodes[1].ChildNodes[0].Value = "102.99"; // Thêm phần tử mới. products.AppendChild(product); Chú ý trong trường hợp này, có một số giả định được áp đặt lên các nút hiện có (ví dụ, giả định con đầu tiên của nút luôn là productName, và con thứ hai luôn là productPrice). Nếu giả định này không bảo đảm đúng, bạn cần phải xét tên của nút. 1.2 Tìm một nút khi biết tên của nó Bạn cần thu lấy một nút cụ thể trong một XmlDocument, và bạn biết tên của nó nhưng không biết vị trí của nó. Sử dụng phương thức XmlDocument.GetElementsByTagName, phương thức này sẽ dò tìm toàn bộ tài liệu và trả về tập hợp System.Xml.XmlNodeList chứa các nút được so trùng.
  4. Lớp XmlDocument cung cấp phương thức GetElementsByTagName dùng để tìm ra các nút có tên cho trước. Nó trả về kết quả là một tập hợp các đối tượng XmlNode. Đoạn mã dưới đây trình bày cách sử dụng GetElementsByTagName để tính tổng giá các item trong một danh mục bằng cách thu lấy tất cả các phần tử có tên là "productPrice": using System; using System.Xml; public class FindNodesByName { private static void Main() { // Nạp tài liệu. XmlDocument doc = new XmlDocument(); doc.Load("ProductCatalog.xml"); // Thu lấy tất cả price. XmlNodeList prices = doc.GetElementsByTagName("productPrice"); decimal totalPrice = 0; foreach (XmlNode price in prices) { // Lấy phần text bên trong của mỗi phần tử được so trùng. totalPrice += Decimal.Parse(price.ChildNodes[0].Value); } Console.WriteLine("Total catalog value: " + totalPrice.ToString()); Console.ReadLine(); } } Bạn cũng có thể dò tìm một phần tài liệu XML bằng phương thức XmlElement.GetElementsByTagName (phương thức này sẽ dò tất cả các nút con để tìm ra nút trùng khớp). Để sử dụng phương thức này, trước hết lấy một XmlNode tương ứng với một phần tử, kế đó ép đối tượng này thành một XmlElement. Ví dụ dưới đây trình bày cách tìm nút price bên dưới phần tử product đầu tiên: // Thu lấy tham chiếu đến product đầu tiên. XmlNode product = doc.GetElementsByTagName("products")[0];
  5. // Tìm nút price bên dưới product này. XmlNode price = ((XmlElement)product).GetElementsByTagName("productPrice")[0]; Console.WriteLine("Price is " + price.InnerText); Nếu các phần tử của bạn có chứa đặc tính ID, bạn cũng có thể sử dụng một phương thức có tên là GetElementById để thu lấy phần tử có giá trị ID trùng khớp. 1.3 Thu lấy các nút XML trong một không gian tên XML cụ thể Bạn cần thu lấy các nút trong một không gian tên cụ thể bằng một XmlDocument. Sử dụng phiên bản nạp chồng của phương thức XmlDocument. GetElementsByTagName (yêu cầu một tên không gian tên làm đối số). Ngoài ra, áp dụng dấu hoa thị (*) vào đối số tên thẻ nếu bạn muốn so trùng tất cả các thẻ. Nhiều tài liệu XML chứa các nút thuộc nhiều không gian tên khác nhau. Ví dụ, tài liệu XML mô tả một bài báo khoa học có thể sử dụng một kiểu đánh dấu riêng để biểu thị các phương trình toán học và các biểu đồ vector. Hoặc một tài liệu XML với các thông tin về đặt hàng có thể kết hợp các thông tin về khách hàng và đơn đặt hàng cùng với một hồ sơ vận chuyển. Tương tự, một tài liệu XML mô tả một giao dịch thương mại có thể bao gồm những phần thuộc cả hai công ty, và những phần này được viết theo ngôn ngữ đánh dấu riêng. Một tác vụ thông thường trong lập trình XML là thu lấy các phần tử thuộc một không gian tên cụ thể. Bạn có thể thực hiện tác vụ này với phiên bản nạp chồng của phương thức XmlDocument.GetElementsByTagName (yêu cầu một tên không gian tên làm đối số). Bạn có thể sử dụng phương thức này để tìm các thẻ theo tên, hoặc tìm tất cả các thẻ trong không gian tên đã được chỉ định nếu bạn áp dụng dấu hoa thị vào đối số tên thẻ. Ví dụ, tài liệu XML phức hợp dưới đây bao gồm các thông tin về đơn đặt hàng và khách hàng trong hai không gian tên khác nhau là http://mycompany/OrderML và http://mycompany/ClientML. Sally Sergeyeva
  6. Và chương trình dưới đây sẽ chọn tất cả các thẻ trong không gian tên http://mycompany/OrderML: using System; using System.Xml; public class SelectNodesByNamespace { private static void Main() { // Nạp tài liệu. XmlDocument doc = new XmlDocument(); doc.Load("Order.xml"); // Thu lấy tất cả các thẻ đặt hàng. XmlNodeList matches = doc.GetElementsByTagName("*", "http://mycompany/OrderML"); // Hiển thị thông tin. Console.WriteLine("Element \tAttributes"); Console.WriteLine("******* \t**********"); foreach (XmlNode node in matches) { Console.Write(node.Name + "\t"); foreach (XmlAttribute attribute in node.Attributes) { Console.Write(attribute.Value + " "); } Console.WriteLine(); } Console.ReadLine(); } } Kết xuất của chương trình này như sau: Element Attributes
  7. ******* ********** ord:order http://mycompany/OrderML http://mycompany/ClientML ord:orderItem 3211 ord:orderItem 1155 1.4 Tìm các phần tử với biểu thức XPath Bạn cần duyệt một tài liệu XML để tìm các nút theo một tiêu chuẩn tìm kiếm cấp cao. Ví dụ, bạn có thể muốn duyệt một nhánh cụ thể của một tài liệu XML để tìm các nút có các đặc tính nào đó hoặc chứa một số lượng nút con lồng bên trong. Thực thi một biểu thức XPath bằng phương thức SelectNodes hay SelectSingleNode của lớp XmlDocument. Lớp XmlNode định nghĩa hai phương thức dùng để tìm kiếm dựa vào biểu thức Xpath là SelectNodes và SelectSingleNode. Hai phương thức này thao tác trên tất cả các nút con. Vì XmlDocument thừa kế từ XmlNode nên bạn có thể gọi XmlDocument.SelectNodes để dò tìm toàn bộ một tài liệu. Xét tài liệu XML mô tả một đơn đặt hàng gồm hai item: Remarkable Office Supplies Electronic Protractor 42.99 Invisible Ink 200.25 Cú pháp của XPath sử dụng ký hiệu giống như đường dẫn. Ví dụ, đường dẫn /Order/Items/Item cho biết phần tử lồng bên trong phần tử , và phần tử lồng bên trong phần tử gốc . Ví dụ dưới đây sử dụng một đường dẫn tuyệt đối để tìm tên của tất cả các item trong một đơn đặt hàng:
  8. using System; using System.Xml; public class XPathSelectNodes { private static void Main() { // Nạp tài liệu. XmlDocument doc = new XmlDocument(); doc.Load("orders.xml"); // Thu lấy tên của tất cả các item. // Việc này không thể hoàn tất dễ dàng với phương thức // GetElementsByTagName(), vì các phần tử Name được sử dụng // bên trong các phần tử Item và các phần tử Client, và do đó // cả hai kiểu này đều sẽ được trả về. XmlNodeList nodes = doc.SelectNodes("/Order/Items/Item/Name"); foreach (XmlNode node in nodes) { Console.WriteLine(node.InnerText); } Console.ReadLine(); } } Kết xuất của chương trỉnh này như sau: Electronic Protractor Invisible Ink XPath cung cấp một cú pháp tìm kiếm mạnh. Do không thể giải thích tất cả các biến thể của nó chỉ trong một mục ngắn như thế này, nên bảng 5.1 chỉ trình bày các phần chính trong một biểu thức XPath và các ví dụ mô tả cách làm việc của chúng với tài liệu XML ở trên. Để hiểu chi tiết hơn, bạn hãy tham khảo tài liệu W3C XPath tại [http://www.w3.org/TR/xpath]. Bảng 5.1 Cú pháp của biểu thức XPath Biểu thức Mô tả
  9. Bắt đầu một đường dẫn tuyệt đối (chọn từ nút gốc). / /Order/Items/Item chọn tất cả các phần tử Item là con của một phần tử Items, mà bản thân Items là con của phần tử gốc Order. Bắt đầu một đường dẫn tương đối (chọn nút bất cứ đâu). // //Item/Name chọn tất cả các phần tử Name là con của một phần tử Item, bất chấp chúng xuất hiện ở đâu trong tài liệu. Chọn một đặc tính của một nút. @ /Order/@id chọn đặc tính có tên là id từ phần tử gốc Order. Chọn bất cứ phần tử nào trong đường dẫn. * /Order/* chọn nút Items và Client vì cả hai đều nằm trong phần tử gốc Order. Kết hợp nhiều đường dẫn. | /Order/Items/Item/Name|Order/Client/Name chọn các nút Name dùng để mô tả một Client và các nút Name dùng để mô tả một Item. Cho biết nút (mặc định) hiện hành. . Nếu nút hiện hành là một Order, biểu thức ./Items chỉ đến các item liên quan với đơn đặt hàng đó. Cho biết nút cha. .. //Name/.. chọn phần tử là cha của một Name, gồm các phần tử Client và Item. Định nghĩa tiêu chuẩn chọn lựa (selection criteria), có thể kiểm tra giá trị của một nút bên trong hay của một đặc tính. /Order[@id="2004-01-30.195496"] chọn các phần tử Order với giá trị [] đặc tính cho trước. /Order/Items/Item[Price > 50] chọn các sản phẩm có giá trên $50. /Order/Items/Item[Price > 50 and Name="Laser Printer"] chọn các sản phẩm trùng khớp với cả hai tiêu chuẩn. Hàm này thu lấy các phần tử dựa vào phần text khởi đầu của phần tử nằm bên trong. starts-with /Order/Items/Item[starts-with(Name,"C")] tìm tất cả các phần tử Item có phần tử Name bắt đầu bằng mẫu tự C. Hàm này thu lấy các phần tử dựa vào vị trí. position /Order/Items/Item[position()=2] chọn phần tử Item thứ hai.
  10. Hàm này đếm số phần tử. Bạn cần chỉ định tên của phần tử con cần đếm hoặc dấu hoa thị (*) cho tất cả các phần tử con. count /Order/Items/Item[count(Price)=1] thu lấy các phần tử Item có đúng một phần tử Price lồng bên trong. Biểu thức XPath và tất cả tên phần tử và đặc tính mà bạn sử dụng trong đó luôn có phân biệt chữ hoa-thường, vì bản thân XML có phân biệt chữ hoa- thường.
Đồng bộ tài khoản