Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 13 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
13
Dung lượng
663,13 KB
Nội dung
Biên tập: thienthanit@yahoo.com Nguồn: Internet XML – Extensible Markup Language được nhắc đến lần đầu tiên vào những năm 90, và giờ đây XML đã trở thành một trong những chuẩn được sử dụng rộng rãi. XML có cấu trúc đơn giản, được tạo thành từ các thẻ giống như HTML, điểm khác là các thẻ XML do người dung tự định nghĩa. XML được dùng chia sẻ dữ liệu giữa các hệ thống được xây dựng trên các nền công nghệ khác nhau. .Net Framework cung cấp rất nhiều các phương thức để chúng ta thao tác với dữ liệu XML. Trong phần này sẽ đề cập đến 4 thao tác chính: Ghi, đọc, tìm kiếm và binding dữ liệu XML 1. Ghi dữ liệu vào file XML Có 2 phương pháp được sử dụng để ghi dữ liệu dạng XML ra file Sử dụng XmlDocument class: là phương pháp chủ yếu được dùng khi ta muốn cập nhật (them, sửa, xóa) một node trên nội dung XML có sẵn. Sử dụng XmlTextWriter class: là phương pháp ghi dữ liệu trực tiếp ra luồng sử dụng XMLTextWriter. Đây là phương pháp đơn giản để tạo nội dung file XML. Các thuộc tính và phương thức cơ bản trong XMLTextWriter: Formating :Định dạng hiển thị XML Indentaion :Khoảng cách thụt đầu dòng WriteStartDocument() :Tạo khai báo XML: <?xml version='1.0' encoding='UTF-8'?> WriteComment() :Tạo comment WriteStartElement() :Tạo các node con WriteAttributeString() :Tạo thuộc tính của node WriteValue() :Tạo giá trị text cho node WriteElementString() :Tạo node và giá trị text đồng thời WriteEndElement() :Kết thúc tạo node Ví dụ về tạo file XML bằng XMLTextWriter XmlTextWriter xmlWriter = new XmlTextWriter(“C:\\DVDList.xml”, Encoding.UTF8); xmlWriter.Formatting = Formatting.Indented; xmlWriter.Indentation = 4; xmlWriter.WriteProcessingInstruction( "xml", "version='1.0' encoding='UTF-8'"); xmlWriter.WriteComment("Pham Ngoc Ha " + DateTime.Now.ToString()); xmlWriter.WriteStartElement("DVDList"); xmlWriter.WriteStartElement("DVD"); Biên tập: thienthanit@yahoo.com Nguồn: Internet xmlWriter.WriteAttributeString("ID", "1"); xmlWriter.WriteAttributeString("Category", "Science"); // Film title xmlWriter.WriteStartElement("Title"); xmlWriter.WriteValue("Tear of the Sun"); xmlWriter.WriteEndElement(); // Film description xmlWriter.WriteStartElement("Description"); xmlWriter.WriteValue("The war in Columbia"); xmlWriter.WriteEndElement(); // Film price xmlWriter.WriteStartElement("Price"); xmlWriter.WriteValue("$40,000,000"); xmlWriter.WriteEndElement(); // Film stars xmlWriter.WriteStartElement("Stars"); xmlWriter.WriteStartElement("Star"); xmlWriter.WriteValue("Bruce Willis"); xmlWriter.WriteEndElement(); xmlWriter.WriteStartElement("Star"); xmlWriter.WriteValue("Monica Bellucci"); xmlWriter.WriteEndElement(); // End Film stars xmlWriter.WriteEndElement(); Biên tập: thienthanit@yahoo.com Nguồn: Internet // End the DVD id = 1 xmlWriter.WriteEndElement(); // End the DVDList xmlWriter.WriteEndElement(); // Close the stream xmlWriter.Close(); 2. Đọc nội dung file XML Có 3 cách để đọc và duyệt qua nội dung của file XML Sử dụng XmlNodeList: nội dung file XML sẽ được đọc vào memory bằng cách dùng phương thức Load() của XmlNodeList. Class này cho phép ta duyệt, tìm kiếm, thay đổi dữ liệu và save ngược lại file Sử dụng XPathNavigator: nội dung file XML sẽ được đọc vào XPathNavigator, đây là class cho phép đọc, duyệt và tìm kiếm dữ liệu nhanh hơn so với XmlNodeList. Tuy nhiên XPathNavigator không có chức năng cập nhật dữ liệu Sử dụng XmlTextReader: là class cho phép duyệt file XML theo từng node một lần từ đầu cho đến cuối file. Tốc độ duyệt rất nhanh và tốn ít tài nguyên. XmlNodeList, XPathNavigator xem nôi dung file XML ở dạng cây phân cấp, bao gồm các node cha và node con. Trong khi đó, XmlTextReader xem nôi dung file XML ở dạng văn bản “phẳng” không phân cấp, bao gồm các element. Vì vậy trong XmlTextReader ta không thể có các phương thức di chuyển như MoveXXX() như XmlNodeList hay XPathNavigator. VD về một file XML <?xml version='1.0' encoding='UTF-8'?> <! Pham Ngoc Ha 2008/09/03 1:26:17 PM > <DVDList> <DVD ID="1" Category="War" Date="08/07/2008"> <Title id="1">Tear of the Sun</Title> <Description>The war in Columbia</Description> <Price>$40,000,000</Price> <Stars> <Star>Bruce Willis</Star> <Star>Monica Bellucci</Star> </Stars> </DVD> </DVDList> Biên tập: thienthanit@yahoo.com Nguồn: Internet Nội dung file được biểu diễn dưới dạng cây Trong cây XML, tất các các thành phần dữ liệu (trừ Attributes) đều được coi là node, kể cả các text nằm giữa các thẻ cũng được coi là node. Để phân biệt, .Net Framework chia làm rất nhiều loại node khác nhau nằm trong enum XmlNodeType Mô tả cây XML 2.1. Sử dụng XmlNodeList static void Main(string[] args) { string fileName = "DVDList.xml"; XmlDocument xmlDocument = new XmlDocument (); Biên tập: thienthanit@yahoo.com Nguồn: Internet xmlDocument.Load(fileName); string content = GetChildNodeContent(xmlDocument.ChildNodes, 0); } private static string GetChildNodeContent(XmlNodeList xmlNodeList, int level) { StringBuilder sb = new StringBuilder(); string indentation = ""; for (int i = 0; i < level; i++) { indentation += " "; } foreach (XmlNode node in xmlNodeList) { sb.Append(indentation); switch (node.NodeType) { case XmlNodeType.XmlDeclaration: sb.Append("Xml Declaration: "); sb.Append(node.Name); sb.Append(" "); sb.AppendLine(node.Value); break; case XmlNodeType.Comment: sb.Append("Comment: "); Biên tập: thienthanit@yahoo.com Nguồn: Internet sb.AppendLine(node.Value); break; case XmlNodeType.Element: sb.Append("Element: "); sb.AppendLine(node.Name); break; case XmlNodeType.Text: sb.Append("- Value:"); sb.AppendLine(node.Value); break; default: break; } // Read attributes if (node.Attributes != null) { foreach (XmlAttribute attribute in node.Attributes) { sb.Append(indentation); sb.Append("- Attribute:"); sb.Append("'" + attribute.Name + "'"); sb.Append(" Value:"); sb.AppendLine("'" + attribute.Value + "'"); } } Biên tập: thienthanit@yahoo.com Nguồn: Internet // Read child nodes if (node.HasChildNodes) { sb.Append(GetChildNodeContent(node.ChildNodes, level + 1)); } } return sb.ToString(); } 2.2. Sử dụng XPathNavigator XPathNavigator hoạt động giống như XmlDocument, nó load toàn bộ dữ liệu XML vào vùng nhớ và có cũng có thể truy cập đến từng node. Tuy nhiên XPathNavigator cung cấp rất nhiều các phương thức giúp chuyển đến các node một cách dễ dàng MoveTo() :Chuyển đến một node được chỉ định MoveChild() :Chuyển đến node con được chỉ định MoveFirstChild() :Chuyển đến node con đầu tiên MoveToFirst() :Chuyển đến node anh em (cùng cấp) đầu tiên MoveNext() :Chuyển đến node anh em kế tiếp MovePrevious() :Chuyển đến node anh em ngay trước MoveToFirstAttribute() :Chuyển đến thuộc tính đầu tiên của node MoveToNextAttribute() :Chuyển đến thuộc tính kế tiếp của node MoveToParent() :Chuyển đến node cha MoveToRoot() :Chuyển đến node Root static void Main(string[] args) { string fileName = "DVDList.xml"; // Load XML file to document XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(fileName); // Create XPathNavigator XPathNavigator xPathNav = xmlDocument.CreateNavigator(); // Get content string content = GetXPathNavContent(xPathNav, 0); Biên tập: thienthanit@yahoo.com Nguồn: Internet } private static string GetXPathNavContent(XPathNavigator xNav, int level) { string indentation = ""; for (int i = 0; i < level; i++) { indentation += " "; } StringBuilder sb = new StringBuilder(); sb.Append(indentation); switch (xNav.NodeType) { case XPathNodeType.Root: sb.AppendLine("Root"); break; case XPathNodeType.Comment: sb.Append("Comment:"); sb.AppendLine(xNav.Value); break; case XPathNodeType.Element: sb.Append("Element: "); sb.AppendLine(xNav.Name); break; Biên tập: thienthanit@yahoo.com Nguồn: Internet case XPathNodeType.Text: sb.Append(" - Value:"); sb.AppendLine(xNav.Value); break; default: break; } // Get attributes if (xNav.HasAttributes) { xNav.MoveToFirstAttribute(); do { sb.Append(indentation); sb.Append(" - Attribute:"); sb.Append(xNav.Name); sb.Append(" - Value: "); sb.AppendLine(xNav.Value); } while (xNav.MoveToNextAttribute()); xNav.MoveToParent(); } if (xNav.HasChildren) { xNav.MoveToFirstChild(); Biên tập: thienthanit@yahoo.com Nguồn: Internet do { sb.Append(GetXPathNavContent(xNav, level + 1)); } while (xNav.MoveToNext()); xNav.MoveToParent(); } return sb.ToString(); } 2.3. Sử dụng XmlTextReader Đây là cách thức đơn giản nhất để đọc nội dung file XML. Tốc độ và sử dụng tài nguyên là ưu điểm của XmlTextReader. Tuy nhiên với XmlTextReader, các node chỉ được duyệt một lần, tuần tự từ trên xuống dưới. Ta không thể di chuyển đến các node cha, node anh em … một cách tự do như với XPathNavigator và XmlDocument. Đối với XmlTextReader, không có khái niệm về node cha, node con, mà được thay bằng khái niệm về Element Name :Tên của element Value :Giá trị của element Read() : Duyệt node tuần tự, trả về false khi kết thúc MoveToFirstAttribute() :Chuyển đến thuộc tính đầu tiên MoveToNextAttribute() :Chuyển đến thuộc tính tiếp theo MoveToElement() :Chuyển đến element tương ứng với thuộc tính hiện tại static void Main(string[] args) { string fileName = "DVDList.xml"; string content = GetTextReaderContent(fileName); } private static string GetTextReaderContent(string fileName) { // Create the reader XmlTextReader reader = new XmlTextReader(new FileStream(fileName, FileMode.Open)); // Create string builder [...]... sb.ToString(); } 2.3.1 Đọc nội dung bắt đầu từ Element cho trước Trong nhiều trường hợp ta muốn đọc và duyệt nội dung XML bắt đầu từ một Element xác định Ta có thể sử dụng phương thức ReadStartElement() của XmlTextReader để thực hiện việc này Ngoài ra sử dụng phương thức ReadElementString() để đọc nội dung text của một Element đã chỉ định static void Main(string[] args) { string fileName = "DVDList .xml" ; string... Main(string[] args) { string fileName = "DVDList .xml" ; string content = GetStartFromSpecificElement(fileName); } private static string GetStartFromSpecificElement(string fileName) { Biên tập: thienthanit@yahoo.com Nguồn: Internet // Create reader XmlTextReader reader = new XmlTextReader(new FileStream(fileName, FileMode.Open)); // Start read at DVDList element reader.ReadStartElement("DVDList"); StringBuilder... (reader.Read()) { // Check node type switch (reader.NodeType) { case XmlNodeType.XmlDeclaration: sb.Append("Declaration:"); sb.Append(reader.Name); sb.AppendLine(reader.Value); break; case XmlNodeType.Comment: sb.Append("Comment:"); sb.AppendLine(reader.Value); break; case XmlNodeType.Element: sb.Append("Element:"); sb.AppendLine(reader.Name); break; case XmlNodeType.Text: sb.Append(" - Value:"); sb.AppendLine(reader.Value);... reader.NodeType.Equals(XmlNodeType.Element)) { reader.ReadStartElement("DVD"); // Write string content of Element sb.AppendLine(reader.ReadElementString("Title")); sb.AppendLine(" " + reader.ReadElementString("Description")); sb.AppendLine(" " + reader.ReadElementString("Price")); sb.AppendLine(); } } reader.Close(); return sb.ToString(); } File XML dùng trong ví dụ DVDList .xml Biên tập: thienthanit@yahoo.com . Main(string[] args) { string fileName = "DVDList .xml& quot;; // Load XML file to document XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(fileName); // Create XPathNavigator. trong enum XmlNodeType Mô tả cây XML 2.1. Sử dụng XmlNodeList static void Main(string[] args) { string fileName = "DVDList .xml& quot;; XmlDocument xmlDocument = new XmlDocument. liệu XML. Trong phần này sẽ đề cập đến 4 thao tác chính: Ghi, đọc, tìm kiếm và binding dữ liệu XML 1. Ghi dữ liệu vào file XML Có 2 phương pháp được sử dụng để ghi dữ liệu dạng XML ra file