Giúp đỡ về thêm xóa sửa file XML

1,438 views
Skip to first unread message

Nguyễn Hữu Vinh

unread,
Nov 17, 2011, 8:28:38 AM11/17/11
to Hỏi đáp
Em có một bài tập như sau: thầy cho 1 file xml có dạng như sau:
<class>
<hotel>
<id>AA001</id>
<vitri>Q.1 Tp.HCM</vitri>
<gia>600000</gia>
<thue>No</thue>
</hotel>
</class>

Thầy yêu cầu là dùng javascript hay là C# thêm vào một node mới, xóa
một node bất kỳ, thay đổi giá trị của một node.

Em mới bắt đầu học nên còn gà lắm. Các anh giúp em với.

Thanks các anh rất nhiều.

Huan Vu Le

unread,
Nov 17, 2011, 6:07:28 PM11/17/11
to hoidap-a...@googlegroups.com
Ở đây H sẽ hướng dẫn dùng C#
 
Các bước cần thực hiện khi thêm node:
  1. Đọc tập tin
  2. Tạo một XmlElement x
  3. Nhập liệu cho x
  4. Đưa x vào một XmlElement nào đó
  5. Lưu tập tin
Các bước cần thực hiện khi xóa node:
  1. Đọc tập tin
  2. Tìm XmlElement x cần xóa
  3. Kêu cha của x xóa x đi
  4. Lưu tập tin
Do thao tác với Xml nên Vinh nhớ thêm namespace "System.Xml" vào nhé

Phần đọc tập tin
  • Nếu là phần mềm từ tập tin thực thi nằm trong bin/debug dùng ../ để ra một cấp, sau đó chọn đượng dẫn đúng (VD: ../../xml/vidu.xml)
  • Nếu là web ta dùng Server.MapPath() đi từ ngoài thư mục chứa solution vào (VD: Server.MapPath("~/xml/vidu.xml")), nếu hàm đọc nằm trong class thay vì trong web form thì nhớ thêm HttpContext.Current. đằng trước Server.MapPath
  • Đoạn code đọc tập tin sẽ là: 
string fileName = Server.MapPath("~/xml/vidu.xml"); 
XmlDocument xDoc= new XmlDocument(); 
xDoc.Load(fileName);

Phần lưu tập tin: Lưu tập tin thì khá dễ 
xDoc.Save(fileName); 

Phần thêm một XmlElement vào tài liệu Xml:
  • Tạo một XmlElement x: Muốn tạo node ta chỉ cần gọi xDoc.CreateElement, sau đó truyền vào tên node là xong, theo cấu trúc xml trên, ta cần tạo các XmlElement là hotel, id, vitri, gia, thue (ở đây ta chỉ cần tạo tất cả XmlElement, chưa cần quan tâm thằng nào là con thằng nào, chỉ cần có bao nhiêu node, liệt kê hết là ok)
XmlElement x = xDoc.CreateElement("hotel");
XmlElement x_id = xDoc.CreateElement("id");
XmlElement x_vitri = xDoc.CreateElement("vitri");
XmlElement x_gia = xDoc.CreateElement("gia");
XmlElement x_thue = xDoc.CreateElement("thue");
  • Nhập liệu cho x: Ta sẽ có 2 trường hợp nhập liệu:
    • Nếu nhập liệu cho một thuộc tính ta dùng xmlElementVariable.SetAttribute("name", "value"); 
    • Nếu nhập liệu cho giá trị được bao quanh bởi thẻ đóng và thẻ mở ta dùng xmlElementVariable.InnerText = value; (trong ví dụ xml trên toàn dùng cách này, tuy nhiên H đưa cả hai để về sau tùy bài tập mà ta linh hoạt)
x_id.InnerText = "AA002";
x_vitri.InnerText = "Q2, Thành phố Hồ Chí Minh";
x_gia.InnerText = "700000";
x_thue.InnerText = "0.01";
  • Đưa x vào một XmlElement nào đó: Ta cứ dùng AppendChild là xong. Ở ví dụ trên: x_id, x_vitri, x_gia, x_thue là con của x, và x thì lại là con của class (class chính là xDoc.DocumentElement)
x.AppendChild(x_id);
x.AppendChild(x_vitri);
x.AppendChild(x_gia);
x.AppendChild(x_thue);
xDoc.DocumentElement.AppendChild(x);

Như vậy đoạn code thêm mới hoàn chỉnh sẽ là:

Phần xóa thì gồm 2 bước
  • Tìm XmlElement x cần xóa: Để tìm ra 1 XmlElement ta có thể:
    • Đọc ra danh sách dựa vào TagName (xDoc.GetElementsByTagName("name")) hoặc XPath (SelectNodes), sau đó lấy phần tử dựa vào chỉ số, hoặc là vòng lặp so sánh, v.v...
    • Đọc chính xác 1 XmlElement dựa vào primary key (cái này khi học tới DTD thì Vinh mới biết cách khai báo để hệ thống hiểu 1 thuộc tính nào đó là primary key, khi đó mới dùng được), hoặc dùng XPath (SelectSingleNode)
Để đơn giản thì H dùng XPath, cú pháp thì Vinh tham khảo tại: http://w3schools.com/xpath/xpath_syntax.asp
Giả sử H cần xóa hotel có id là AA002 thì dùng XPath như sau:
 XmlElement x = (XmlElement)xDoc.SelectSingleNode("//hotel[id='AA002']");
  • Kêu cha của x xóa x đi
x.ParentNode.RemoveChild(x);

Như vậy code cho phần xóa sẽ là:

Về phần sửa thì nó kết hợp cả xóa và thêm:
  • Chọn XmlElement cần sửa --> Xem chọn XmlElement phần xóa
  • Thay đổi thông tin --> Xem nhập liệu ở phần thêm
Giả sử H cần đổi địa chỉ cho hotel có id là AA001 thành "Đà Lạt" ta làm như sau:

Cú pháp XPath tham khảo:



Hữu Vinh Nguyễn

unread,
Nov 17, 2011, 10:53:14 PM11/17/11
to hoidap-a...@googlegroups.com, Nguyễn, Quân, pe Uyên, Trí Nhân, VĂN THÀNH NGUYỄN, Xu Le
Cảm ơn A.Huân rất nhiều.

Vào 06:07 Ngày 18 tháng 11 năm 2011, Huan Vu Le <alphap...@gmail.com> đã viết:



--
Nguyễn Hữu Vinh

Nguyễn Ken

unread,
Nov 19, 2016, 11:44:58 PM11/19/16
to Hỏi đáp
cho e xin lai code hoan chinh di anh

Vào 06:07:28 UTC+7 Thứ Sáu, ngày 18 tháng 11 năm 2011, Huan Vu Le đã viết:
Reply all
Reply to author
Forward
0 new messages