Cấp bậc tác giả:

DOTNET

Xử lý XML trong lập trình C# .NET - Phần VI

Được viết bởi QuangIT ngày 20/09/2012 lúc 03:02 PM
Cho đến thời điểm này, có lẽ các bạn cũng đã khá rành cách chọn 1 nút trên tài liệu, nhưng đã chọn được rồi, thì tất nhiên là sẽ có những lúc bạn muốn thêm, xóa hoặc chỉnh sửa 1 nút nào đó.
  • 0
  • 3829

Xử lý XML trong lập trình C# .NET - Phần VI


KỲ 6

THÊM, XÓA, CẬP NHẬT NÚT TRONG TÀI LIỆU XML


Cho đến thời điểm này, có lẽ các bạn cũng đã khá rành cách chọn 1 nút trên tài liệu, nhưng đã chọn được rồi, thì tất nhiên là sẽ có những lúc bạn muốn thêm, xóa hoặc chỉnh sửa 1 nút nào đó. Trong kỳ này, mình sẽ hướng dẫn các bạn xử lý những vấn đề này.

Chúng ta sẽ làm thử 1 ứng dụng 

Ứng dụng của chúng ta gồm:

-6 label, trong đó label6 là label dùng để hiện thị vị trí của nút hiện hành (lblRecord).

-1 combobox để hiện mã số nhân viên

-4 textbox dùng để hiện thị thông tin nhân viên

-3 button tương ứng với 3 tính năng: thêm,cập nhật, xóa.

-4 button để di chuyển trên tài liệu: về đầu, lùi 1 nút, tăng 1 nút, về cuối.


Đầu tiên, bạn nhớ Imports System.Xml rồi sau đó khai báo 2 biến thành viên:


int chimuc 0;
     
XmlDocument doc = new XmlDocument();  


Thụ lý tình huống Load của của Form:

private void Form1_Load(object sender, System.EventArgs e)

 {

     doc.Load(Application.StartupPath + "\\employees.xml");

     foreach (XmlNode node in doc.DocumentElement.ChildNodes) {

         cboEmployeeID.Items.Add(node.Attributes("employeeid").Value);

     }

     cboEmployeeID.SelectedIndex = 0;

     FillControls();

     UpdateLabel();

 }

Trong Form1_Load, bạn thấy đơn giản là chúng ta cho mở tập tin employees.xml, sau đó tìm đến nút nguồn của tài liệu (employees), tìm và thêm các attribute employeeid của nút employee vào combobox. Rồi cho chọn phần tử đầu tiên của combobox.

Kế đến là 2 phương thức FillControls (điền đầy thông tin nhân viên vào các textbox thông tin) và UpdateLabel (cập nhật vị trí nút trên lblRecord). 2 phương thức này, tí nữa chúng ta sẽ xây dựng.


Bây giờ, chúng ta tiếp tục thụ lý tình huống Click cho 4 button di chuyển trên tài liệu:

private void btnFirst_Click(object sender, System.EventArgs e)

 {

     chimuc = 0;

     FillControls();

     UpdateLabel();

 }



 private void btnPrevious_Click(object sender, System.EventArgs e)

 {

    chimuc = chimuc - 1;

     if (chimuc < 0) {

         chimuc = 0;

     }

     FillControls();

     UpdateLabel();

 }




 private void btnNext_Click(object sender, System.EventArgs e)

 {

     chimuc = chimuc + 1;

     if (chimuc >= doc.DocumentElement.ChildNodes.Count - 1) {

         chimuc = doc.DocumentElement.ChildNodes.Count - 1;

     }

     FillControls();

     UpdateLabel();

 }



 private void btnLast_Click(object sender, System.EventArgs e)

 {

     chimuc = doc.DocumentElement.ChildNodes.Count - 1;

     FillControls();

     UpdateLabel();

 }


4 phương thức này cũng không có chi quá khó hiểu, đơn giản là lấy chỉ mục của nút hiện hành gán vào biến chimuc. Cuối cùng, 2 phương thức FillControl và UpdateLabel sẽ dựa vào giá trị của biến chimuc này mà tìm đến nút tương ứng trong tài liệu.


Giờ đây, chúng ta bắt đầu xây dựng 2 phương thức FillControl và UpdateLabel để hoàn tất nửa chặng đường đầu tiên:


//Fill Controls

 public void FillControls()

 {

     //node = nút con th? <chimuc> c?a nút g?c c?a tài li?u

     XmlNode node = doc.DocumentElement.ChildNodes(chimuc);

     //combobox mã s? nhân viên = giá tr? c?a attribute employeeid c?a nút con v?a tìm

     cboEmployeeID.Text = node.Attributes("employeeid").Value;

     //gán chu?i n?m gi?a c?p tag ?óng-m? cho các textbox thông tin

     txtFirstName.Text = node.ChildNodes(0).InnerText;

     txtLastName.Text = node.ChildNodes(1).InnerText;

     txtHomePhone.Text = node.ChildNodes(2).InnerText;

     txtNotes.Text = node.ChildNodes(3).InnerText;

 }



 //Update Label

 public void UpdateLabel()

 {

     //doc.Document.ChildNodes.Count = s? nút con c?a nút g?c c?a tài li?u

     lblRecord.Text = (chimuc + 1).ToString + "/" + doc.DocumentElement.ChildNodes.Count;

 }


Nửa chặng đường tiếp theo chúng ta bắt đầu lo cho việc thêm,xóa, sửa thông tin cho nút:


Dễ nhất là cập nhật (UPDATE) thông tin cho một nút:


-Đoạn mã thụ lý tình huống Click của button UPDATE


private void btnUpdate_Click(object sender, System.EventArgs e)

 {

     //ch?n 1 nút t??ng ?ng v?i mã nhân viên ???c ch?n t? cboEmployeeID

     XmlNode node = doc.SelectSingleNode("employees/employee[@employeeid = '" + cboEmployeeID.SelectedItem + "']");

     //n?u có nhân viên t??ng ?ng

     if (node != null) {

         //gán các giá tr? trong các textbox thông tin

         //vào gi?a c?p tag ?óng-m? c?a các nút con c?a nút ?ang xét

         //? ?ây là các tag: firstname,lastname,notes c?a nút employee

         node.ChildNodes(0).InnerText = txtFirstName.Text;

         node.ChildNodes(1).InnerText = txtLastName.Text;

         node.ChildNodes(2).InnerText = txtNotes.Text;

         //riêng v?i CData, ta ph?i làm b?ng cách t?o 1 bi?n ki?u XmlCDataSection

         //ph??ng th?c doc.CreateCDataSection s? giúp ta t?o 1 CData d?a trên 1 chu?i ???c truy?n vào ph??ng th?c

         XmlCDataSection notes = doc.CreateCDataSection(txtNotes.Text);

         //thay th? CDataSection c? là : node.ChildNodes(3).ChildNodes(0)

         //b?i nút notes

         node.ChildNodes(3).ReplaceChild(notes, node.ChildNodes(3).ChildNodes(0));

         //l?u l?i tài li?u

         doc.Save(Application.StartupPath + "\\employees.xml");

     }

 }


-Kế đến là công việc xóa nút

Đoạn mã thụ lý tình huống Click của button DELETE:


private void btnDelete_Click(object sender, System.EventArgs e)

 {

     //ch?n 1 nút t??ng ?ng v?i mã nhân viên ???c ch?n t? cboEmployeeID

     XmlNode node = doc.SelectSingleNode("employees/employee[@employeeid = '" + cboEmployeeID.SelectedItem + "']");

     //n?u có nhân viên t??ng ?ng

     if (node != null) {

         //di chuy?n nút employee t??ng ?ng kh?i tài li?u

         //thông qua ph??ng th?c RemoveChild(<nut can xoa>)

         //c?a doc.DocumentElement

         doc.DocumentElement.RemoveChild(node);

     }

     //l?u l?i tài li?u

     doc.Save(Application.StartupPath + "\\employees.xml");

     //C?p nh?t l?i s? v? trí c?a nút

     UpdateLabel();

 }


-Công việc cuối cùng của chúng ta là thêm 1 nút mới vào tài liệu, đoạn mã có thể hơi dài, nhưng cũng không quá khó để hiểu:

Đoạn mã thụ lý tình huống Click của Button ADD


private void btnAdd_Click(object sender, System.EventArgs e)

 {

     //khai báo các bi?n ph?n t? (XmlElement) c?a tài li?u

     //?ng v?i tên c?a chúng ???c truy?n vào ph??ng th?c CreateElement

     XmlElement employee = doc.CreateElement("employee");

     XmlElement firstname = doc.CreateElement("firstname");

     XmlElement lastname = doc.CreateElement("lastname");

     XmlElement homephone = doc.CreateElement("homephone");

     XmlElement notes = doc.CreateElement("notes");

     //khai báo 1 bi?n t??ng tr?ng cho attribute employeeid (XmlAttribute)

     //v?i tên là chu?i ???c truy?n vào ph??ng th?c CreateAttribute

     XmlAttribute employeeid = doc.CreateAttribute("employeeid");

     //gán giá tr? c?a cboEmployeeID vào

     //bi?n attribute employeeid v?a t?o

     employeeid.Value = cboEmployeeID.Text;

     //khai báo các bi?n t??ng tr?ng cho chu?i n?m gi?a c?p tag ?óng-m? c?a 1 nút b?t k?

     //v?i giá tr? là chu?i ???c truy?n vào ph??ng th?c CreateTextNode

     XmlText firstnametext = doc.CreateTextNode(txtFirstName.Text);

    XmlText lastnametext = doc.CreateTextNode(txtLastName.Text);

     XmlText homephonetext = doc.CreateTextNode(txtHomePhone.Text);

     //riêng ??i v?i ?o?n v?n b?n n?m trong tag CData, ta ph?i làm cách khác v?i cách XmlText

     //t?o 1 bi?n ki?u XmlCDataSection

     XmlCDataSection notestext = doc.CreateCDataSection(txtNotes.Text);

     //ph?n t? notes thêm notestext vào b?n thân nó.

     notes.AppendChild(notestext);

     //ph?n t? employee thêm attribute employeeid vào b?n thân nó

     employee.Attributes.Append(employeeid);

     //cho ph?n t? employee có các nút con là : firstname,lastname,homephone và notes

     employee.AppendChild(firstname);

     employee.AppendChild(lastname);

     employee.AppendChild(homephone);

     employee.AppendChild(notes);

     //thêm ph?n t? employee v?a t?o vào nút g?c employees c?a tài li?u

     doc.DocumentElement.AppendChild(employee);

     //l?u l?i tài li?u

     doc.Save(Application.StartupPath + "\\employees.xml");

     //c?p nh?t l?i thông tin v? trí c?a nút

     UpdateLabel();

 }

Nguồn bài viết: Sưu tầm

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML