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

Các giải pháp lập trình CSharp- P17 ppt

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 (2.61 MB, 10 trang )

161
Chương 5: XML
MessageBox.Show(err.Message);
return;
}
// Đổ dữ liệu vào TreeView.
ConvertXmlNodeToTreeNode(doc, treeXml.Nodes);
// Mở rộng tất cả các nút.
treeXml.Nodes[0].ExpandAll();
}
private void ConvertXmlNodeToTreeNode(XmlNode xmlNode,
TreeNodeCollection treeNodes) {
// Thêm một TreeNode mô tả XmlNode này.
TreeNode newTreeNode = treeNodes.Add(xmlNode.Name);
// Tùy biến phần text cho TreeNode dựa vào
// kiểu và nội dung của XmlNode.
switch (xmlNode.NodeType) {

case XmlNodeType.ProcessingInstruction:
case XmlNodeType.XmlDeclaration:
newTreeNode.Text = "<?" + xmlNode.Name + " " +
xmlNode.Value + "?>";
break;
case XmlNodeType.Element:
newTreeNode.Text = "<" + xmlNode.Name + ">";
break;
case XmlNodeType.Attribute:
newTreeNode.Text = "ATTRIBUTE: " + xmlNode.Name;
break;
case XmlNodeType.Text:
case XmlNodeType.CDATA:


newTreeNode.Text = xmlNode.Value;
break;
case XmlNodeType.Comment:
newTreeNode.Text = "<! " + xmlNode.Value + " >";
162
Chương 5: XML
break;
}
// Gọi phương thức này một cách đệ quy cho mỗi đặc tính
// (XmlAttribute là một lớp con của XmlNode).
if (xmlNode.Attributes != null) {
foreach (XmlAttribute attribute in xmlNode.Attributes) {
ConvertXmlNodeToTreeNode(attribute, newTreeNode.Nodes);
}
}
// Gọi phương thức này một cách đệ quy cho mỗi nút con.
foreach (XmlNode childNode in xmlNode.ChildNodes) {
ConvertXmlNodeToTreeNode(childNode, newTreeNode.Nodes);
}
}
}
Xét file XML dưới đây (ProductCatalog.xml):
<?xml version="1.0" ?>
<productCatalog>
<catalogName>Jones and Jones Unique Catalog 2004</catalogName>
<expiryDate>2005-01-01</expiryDate>
<products>
<product id="1001">
<productName>Gourmet Coffee</productName>
<description>The finest beans from rare Chilean

plantations.</description>
<productPrice>0.99</productPrice>
<inStock>true</inStock>
</product>
<product id="1002">
<productName>Blue China Tea Pot</productName>
<description>A trendy update for tea drinkers.</description>
<productPrice>102.99</productPrice>
<inStock>true</inStock>
163
Chương 5: XML
</product>
</products>
</productCatalog>
Hình 5.1
Cấu trúc của một tài liệu XML
[
Hình 5.2
InnerText của phần tử gốc
Hình 5.3
InnerXml của phần tử gốc
164
Chương 5: XML
Hình 5.4
OuterXml của phần tử gốc
2.
2.
Chèn thêm nút vào tài li u XMLệ
Chèn thêm nút vào tài li u XMLệ



Bạn cần điều chỉnh một tài liệu
XML
bằng cách chèn vào dữ liệu mới, hoặc bạn
muốn tạo một tài liệu hoàn toàn mới trong bộ nhớ.


Tạo nút bằng một phương thức của
XmlDocument
(như
CreateElement
,
CreateAttribute
,
CreateNode
). Kế tiếp, chèn nó vào bằng một phương thức của
XmlNode
(như
InsertAfter
,
InsertBefore
, hay
AppendChild
).
Chèn một nút vào
XmlDocument
bao gồm hai bước: tạo nút rồi chèn nó vào vị trí thích hợp. Sau
đó, bạn có thể gọi
XmlDocument.Save
để lưu lại những thay đổi.

Để tạo một nút, bạn sử dụng một trong các phương thức của
XmlDocument
bắt đầu bằng từ
Create
, tùy thuộc vào kiểu của nút. Việc này bảo đảm nút sẽ có cùng không gian tên như phần
còn lại của tài liệu (bạn cũng có thể cung cấp một không gian tên làm đối số). Kế tiếp, bạn
phải tìm một nút phù hợp và sử dụng một trong các phương thức chèn của nó để thêm nút mới
vào.
Ví dụ dưới đây trình bày kỹ thuật này bằng cách tạo một tài liệu XML mới:
using System;
using System.Xml;
public class GenerateXml {
private static void Main() {
// Tạo một tài liệu mới rỗng.
XmlDocument doc = new XmlDocument();
XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(docNode);
// Tạo và chèn một phần tử mới.
165
Chương 5: XML
XmlNode productsNode = doc.CreateElement("products");
doc.AppendChild(productsNode);
// Tạo một phần tử lồng bên trong (cùng với một đặc tính).
XmlNode productNode = doc.CreateElement("product");
XmlAttribute productAttribute = doc.CreateAttribute("id");
productAttribute.Value = "1001";
productNode.Attributes.Append(productAttribute);
productsNode.AppendChild(productNode);
// Tạo và thêm các phần tử con cho nút product này
// (cùng với dữ liệu text).

XmlNode nameNode = doc.CreateElement("productName");
nameNode.AppendChild(doc.CreateTextNode("Gourmet Coffee"));
productNode.AppendChild(nameNode);
XmlNode priceNode = doc.CreateElement("productPrice");
priceNode.AppendChild(doc.CreateTextNode("0.99"));
productNode.AppendChild(priceNode);
// Tạo và thêm một nút product khác.
productNode = doc.CreateElement("product");
productAttribute = doc.CreateAttribute("id");
productAttribute.Value = "1002";
productNode.Attributes.Append(productAttribute);
productsNode.AppendChild(productNode);
nameNode = doc.CreateElement("productName");
nameNode.AppendChild(doc.CreateTextNode("Blue China Tea Pot"));
productNode.AppendChild(nameNode);
priceNode = doc.CreateElement("productPrice");
priceNode.AppendChild(doc.CreateTextNode("102.99"));
productNode.AppendChild(priceNode);
// Lưu tài liệu.
doc.Save(Console.Out);
Console.ReadLine();
}
}
166
Chương 5: XML
Tài liệu được tạo ra trông giống như sau:
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product id="1001">
<productName>Gourmet Coffee</productName>

<productPrice>0.99</productPrice>
</product>
<product id="1002">
<productName>Blue China Tea Pot</productName>
<productPrice>102.99</productPrice>
</product>
</products>
3.
3.
Chèn thêm nút vào tài li u XML m t cách nhanh chóngệ ộ
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);
167
Chương 5: XML
if (textContent != null) {
XmlNode content;
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);
168
Chương 5: XML
XmlHelper.AddElement("productPrice", "0.99", product);
product = XmlHelper.AddElement("product", null, products);
XmlHelper.AddAttribute("id", "1002", product);
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

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.
169
Chương 5: XML
4.
4.
Tìm m t nút khi bi t tên c a nóộ ế ủ
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.
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

170
Chương 5: XML
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];
// 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

GetElementById
để thu lấy phần tử có giá trị
ID
trùng khớp.
5.
5.
Thu l y các nút XML trong m t không gian tên XML c thấ ộ ụ ể
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


http://mycompany/ClientML
.
<?xml version="1.0" ?>
<ord:order xmlns:ord="http://mycompany/OrderML"
xmlns:cli="http://mycompany/ClientML">
<cli:client>

×