Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 25 kết quả

Đề tài: Xử lý XML trong lập trình C# .NET

  1. #1
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Talking Xử lý XML trong lập trình C# .NET

    KỲ 1
    MỞ MỘT TÀI LIỆU XML


    Để mở một tài liệu XML, bạn cần sử dụng lớp XmlDocument. Lớp XmlDocument cho phép bạn mở tài liệu XML theo 3 cách thông dụng sau:
    -Bạn có thể mở thông qua 1 đường dẫn trên ổ cứng, một URL, hoặc 1 tập tin XML.
    -Bạn có thể sử dụng đối tượng stream như FileStream chứa dữ liệu của tài liệu XML.
    -Bạn có mở thông qua 1 chuỗi chứa XML trong bộ nhớ

    Để thấy được các đặc tính này, trong kỳ 1 này, chúng ta cùng làm thử 1 ứng dụng nhỏ như con thỏ nhé:

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		open_xml.png
Lần xem:	2456
Size:		7.0 KB
ID:		5201


    Ứng dụng của chúng ta bao gồm: 3 radio button cho việc chọn nơi chứa tài liệu mà lớp XmlDocument sẽ mở. 1 textbox dùng để nhập đường dẫn đến tập tin xml, hoặc URL hoặc 1 string chứa chuỗi XML. Cuối cùng là 1 button dùng để thực thi các câu lệnh để mở tài liệu. Sau đây là đoạn code thụ lý tình huống Click của button:

    Visual C# Code:
    1. private void Button1_Click(object sender, System.EventArgs e)
    2.  {
    3.      try {
    4.          string path = TextBox1.Text;
    5.          XmlDocument document = new XmlDocument();
    6.          if (RadioButton1.Checked == true) {
    7.              document.Load(path);
    8.          }
    9.          if (RadioButton2.Checked == true) {
    10.              System.IO.FileStream fs;
    11.              fs = System.IO.File.OpenRead(path);
    12.              document.Load(fs);
    13.          }
    14.          if (RadioButton3.Checked == true) {
    15.              document.Load(path);
    16.          }
    17.          MessageBox.Show("Mở tài liệu XML thành công!");
    18.      }
    19.      catch (Exception ex) {
    20.          MessageBox.Show(ex.Message);
    21.      }
    22. }


    Đoạn code trên tạo 1 thể hiện của lớp XmlDocument. Lớp này có 2 phương thức quan trọng là: Load() và LoadXml(). Như bạn đã thấy, các đối số mà phương thức Load() nhận có thể là: 1 chuỗi chứa URL chứa tài liệu xml, hoặc 1 stream, hoặc 1 chuỗi chứa tài liệu XML.
    Ở đây, có điều cần lưu ý với các bạn là: nhớ imports namespace: System.Xml nhé, vì đây chính là namespace chứa class XmlDocument, và là 1 trong các namespace chủ lực của .NET hỗ trợ làm việc với XML.

    Để tiện cho mọi người thực hành, mình up lên đây: 1 file xml để thực hành (employees.xml), và mã nguồn của chương trình đầu tiên này.

    Tác giả: neverland
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 03-02-2008 lúc 02:24 PM.
    Keep moving forward!

    ... Retired ...

  2. #2
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định Di chuyển xuyên qua tài liệu xml

    KỲ 2
    DI CHUYỂN XUYÊN QUA TÀI LIỆU XML


    Một tài liệu XML bao gồm 1 hoặc nhiều nút, và có những nút nằm bên trong nút khác. Những nút nằm bên trong nút khác gọi là nút con.
    Lớp XmlNode có 1 tập hợp gọi là ChildNodes mà chứa danh sách tất cả các nút con của một nút bất kỳ. Ngoài ra, chúng còn có các thuộc tính: ParentNode, FirstChild, LastChild, NextSibling và PreviousSibling mà cho phép bạn di chuyển đến bất kỳ nút nào. Như thuộc tính ParentNode giúp bạn di chuyển đến nút cha của 1 nút nào đó, hoặc thuộc tính NextSibling giúp bạn di chuyển đến nút kế tiếp ở cùng cấp của nút hiện hành.

    Kỳ này, chúng ta cũng thử làm 1 project nhỏ:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		move_data_xml.png
Lần xem:	2504
Size:		10.0 KB
ID:		5202

    Ứng dụng của chúng ta chỉ có 1 treeview. Mục đích của chúng ta là hiển thị cấu trúc của tập tin XML lên treeview lúc chương trình được Load lên.
    Visual C# Code:
    1. private void Form1_Load(object sender, System.EventArgs e)
    2.  {
    3.      string path = Application.StartupPath + "\\employees.xml";
    4.      XmlDocument document = new XmlDocument();
    5.      document.Load(path);
    6.      TreeNode rootnode = TreeView1.Nodes.Add(document.DocumentElement.Name);
    7.      XmlNodeList nodes = document.DocumentElement.ChildNodes;
    8.      foreach (XmlNode childnode in nodes) {
    9.          TreeNode empNode = new TreeNode(childnode.Name + ":" + childnode.Attributes("employeeid").Name + "=" + childnode.Attributes("employeeid").Value);
    10.          foreach (XmlNode node in childnode.ChildNodes) {
    11.              if (node.Name == "firstname") {
    12.                  empNode.Nodes.Add("First Name:" + node.InnerText);
    13.              }
    14.             if (node.Name == "lastname") {
    15.                  empNode.Nodes.Add("Last Name:" + node.InnerText);
    16.              }
    17.              if (node.Name == "homephone") {
    18.                  empNode.Nodes.Add("Home Phone:" + node.InnerText);
    19.              }
    20.              if (node.Name == "notes") {
    21.                  empNode.Nodes.Add("Notes:" + node.InnerText);
    22.              }
    23.          }
    24.          rootnode.Nodes.Add(empNode);
    25.      }
    26.  }

    Lưu ý: Nhớ import namespace System.Xml

    Đoạn code tạo 1 thể hiện của lớp XmlDocument và nạp tập tin employees.xml được đặt trong cùng thư mục của file thực thi của chương trình. Nút gốc của tài liệu xml có thể được truy cập thông qua thuộc tính DocumentElement của đối tượng thể hiện của lớp XmlDocument. Thuộc tính Name của DocumentElement trả về tên của nút gốc này (employees).

    Nút employees chứa 3 nút employee, để truy cập 3 nút này, ta dùng thuộc tính ChildNodes của DocumentElement mà ta đã nói ở trên. Tà dùng vòng lặp foreach để đi lần lượt qua từng nút employee một.

    Để truy cập attribute employeeid, ta sử dụng collection Attribute của lớp XmlNode. Bạn có thể xác định attribute nào cần lấy thông qua chỉ mục hoặc tên của nó.
    Để nhận được chuỗi nằm giữa 1 cặp tag, ta dùng thuộc tính InnerText của XmlNode.

    Tác giả: neverland
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 03-02-2008 lúc 02:26 PM.
    Keep moving forward!

    ... Retired ...

  3. #3
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định NHẬN CÁC PHẦN TỬ BẤT KỲ BẰNG CÁCH SỬ DỤNG PHƯƠNG THỨC GetElementByTagName

    KỲ 3
    NHẬN CÁC PHẦN TỬ BẤT KỲ BẰNG CÁCH SỬ DỤNG PHƯƠNG THỨC GetElementByTagName()

    Lớp XmlDocument có phương thức GetElementByTagName() giúp bạn tìm ra những node có tag do bạn chỉ định. Chẳng hạn, trong employees.xml có 3 nút employee. Mình nhập chuỗi "employee" thì nó sẽ trả về cho mình 3 nút này dễ dàng. Cùng làm thử 1 ứng dụng với mình nhé!

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		GetElementByTagName.png
Lần xem:	41
Size:		8.0 KB
ID:		5203

    Ứng dụng của chúng ta gồm 1 textbox để nhập tên tag cần lấy, 1 listbox để hiện thi danh sách các nút có tag tìm được, 1 textbox để hiển thị nội dung của nút đó. Và 1 button để thực thi câu lệnh dùng để lấy nút thông qua tên tag.

    Trước khi thụ lý, tình huống Click của button, bạn cần khai báo 1 biến thành viên của class như sau:

    PHP Code:
       XmlNodeList nodelist
    XmlNodeList là 1 class dùng để chứa 1 tập hợp các lớp. (tựa giống thằng ArrayList thôi). Không có gì phải quan trọng, nghĩ xa xôi về nó :-D

    Bây giờ mới đến lúc thụ lý tình huống Click của button nè:

    Visual C# Code:
    1. private void Button1_Click(object sender, System.EventArgs e)
    2.  {
    3.      //làm sạch listbox
    4.      ListBox1.Items.Clear();
    5.      //mở tài liệu XML
    6.      XmlDocument doc = new XmlDocument();
    7.      doc.Load(Application.StartupPath + "\\employees.xml");
    8.      //đưa tất cả các nút tìm được qua tên tag
    9.      //vào nodelist
    10.      nodelist = doc.GetElementsByTagName(TextBox1.Text);
    11.      //đi lần lượt qua từng node cuaa nodelist
    12.      //và đưa nó vào listbox
    13.      foreach (XmlNode node in nodelist) {
    14.          ListBox1.Items.Add(node.Name);
    15.      }
    16.  }


    Bây giờ, mỗi lần người dùng chọn 1 tên nút trên listbox thì giá trị của nút đó sẽ được hiển thị trên textbox kia thì ta cần thụ lý tình huống SelectedIndexChanged của listbox:

    Visual C# Code:
    1. private void ListBox1_SelectedIndexChanged(object sender, System.EventArgs e)
    2.  {
    3.      TextBox2.Text = nodelist(ListBox1.SelectedIndex).InnerText;
    4.  }

    Tác giả: neverland
    Keep moving forward!

    ... Retired ...

  4. #4
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định CHỌN NHIỀU NÚT BẤT KỲ BẰNG CÁCH SỬ DỤNG PHƯƠNG THỨC SelectNodes

    KỲ 4
    CHỌN NHIỀU NÚT BẤT KỲ BẰNG CÁCH SỬ DỤNG PHƯƠNG THỨC SelectNodes()

    Lớp XmlDocument có phương thức SelectNodes() mà chấp nhận 1 chuỗi chứa câu truy vấn để tìm lọc ra những nút mà bạn muốn, nó sẽ trả về đối tượng XmlNodeList chứa danh sách tất cả các nút thỏa mãn điều kiện truy tìm.
    Để hiểu rõ phương thức này, chúng ta cùng làm thử 1 ứng dụng nhỏ:

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		SelectNodes.png
Lần xem:	2435
Size:		7.3 KB
ID:		5204

    Ứng dụng của chúng ta bao gồm:
    -1 textbox để điền tên của 1 người nào đó
    -2 radio button: 1 để chọn tìm kiếm theo tên, 1 để chọn tìm kiếm theo họ.
    -2 button
    -10 textbox
    -1 combobox để hiện thị mã nhân viên (employeeid) tương ứng với ông nhân viên mà bạn tìm.

    Trước khi thụ lý các tình hướng, bạn làm:
    -Imports System.Xml
    -Khai báo 1 biến thành viên:
    Dim nodelist As XmlNodeList
    -Thụ lý tình huống Click của nút “Tìm”:

    Visual C# Code:
    1. private void Button1_Click(object sender, System.EventArgs e)
    2.  {
    3.      //mở tập tin employees.xml
    4.      XmlDocument doc = new XmlDocument();
    5.      doc.Load(Application.StartupPath + "\\employees.xml");
    6.      //nếu chọn radio button "Tên"
    7.      if (RadioButton1.Checked == true) {
    8.          //chọn phần tử employee nào
    9.          //mà có ông con firstname nào = <textbox1.Text>
    10.          //trả về các nút employee hợp lệ vào biến nodelist
    11.          nodelist = doc.SelectNodes("/employees/employee[./firstname/text() = '" + TextBox1.Text + "']");
    12.      }
    13.      //nếu chọn radio button "Họ"
    14.      if (RadioButton2.Checked) {
    15.          //chọn phần tử employee nào
    16.          //mà có ông con lastname nào = <textbox1.Text>
    17.          //trả về các nút employee hợp lệ vào biến nodelist
    18.          nodelist = doc.SelectNodes("/employees/employee[./lastname/text() = '" + TextBox1.Text + "']");
    19.      }
    20.      //đi xuyên qua các nút employee
    21.      //của tập hợp các nút employee vừa tìm được ở trên
    22.      foreach (XmlNode node in nodelist) {
    23.          ComboBox1.Items.Add(node.Attributes("employeeid").Value);
    24.      }
    25.      ComboBox1.SelectedIndex = 0;
    26.  }


    Ở đoạn code tên không có gì đáng phải bàn nhiều, duy câu truy vấn là đáng bàn, bạn cứ hình dung bạn tìm 1 nút thông qua 1 đường dẫn khởi phát từ nút nguồn của tài liệu (employees).
    /employees/employee[./firstname/text() = '" + TextBox1.Text + "']"
    Nhu vậy, ta dịch câu truy vấn này như sau: “hãy cho tôi các nút employee mà có firstname = 1 tên chỉ định trong textbox1.
    Hàm text() là hàm trả về đoạn text của 1 nút (ở đây là nút firstname).
    Bạn lưu ý là nó sẽ trả về các nút employee, chứ không phải các nút firstname hay lastname gì đâu nhé.

    Lúc này, nếu tìm được các nút thỏa điều kiện, user sẽ chọn mã số nhân viên trong combobox, và nhấn nút “Hiển thị” để cho biết các thông tin của nhân viên ứng với mã số nhân viên đó. Vậy, ta có đoạn code thụ lý tình huống Click của nút “Hiển thị” như sau:

    Visual C# Code:
    1. private void Button2_Click(object sender, System.EventArgs e)
    2.  {
    3.      //label FirstName = giá trị nằm giữa cặp tag <firstname>...</firstname>
    4.      Label8.Text = nodelist(ComboBox1.SelectedIndex).ChildNodes(0).InnerText;
    5.      //label LastName = giá trị nằm giữa cặp tag <lastname>...</lastname>
    6.      Label9.Text = nodelist(ComboBox1.SelectedIndex).ChildNodes(1).InnerText;
    7.      //label HomePhone = giá trị nằm giữa cặp tag <homephone>...</homephone>
    8.      Label10.Text = nodelist(ComboBox1.SelectedIndex).ChildNodes(2).InnerText;
    9.      //label notes = giá trị nằm giữa cặp tag <notes>...</notes>
    10.      Label11.Text = nodelist(ComboBox1.SelectedIndex).ChildNodes(3).InnerText;
    11.  }

    Tác giả: neverland
    Keep moving forward!

    ... Retired ...

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định CHỌN MỘT NÚT BẤT KỲ BẰNG CÁCH SỬ DỤNG PHƯƠNG THỨC SelectSingleNode

    KỲ 5
    CHỌN MỘT NÚT BẤT KỲ BẰNG CÁCH SỬ DỤNG PHƯƠNG THỨC SelectSingleNode()


    Ở kỳ 4, bạn đã được biết qua chức năng của phương thức SelectNodes() của class XmlDocument, nhưng cũng có nhiều lúc bạn chỉ muốn chọn một nút mà thôi. Tất nhiên là vẫn có thể dùng SelectNodes(), tuy nhiên có vẻ không hợp lý lắm. Bởi thế, class XmlNode còn cung cấp cho bạn phương thức SelectSingleNode() cho việc chọn 1 nút.
    Để dễ dàng theo dõi, mình post lại nội dung của tập tin employees.xml:

    XML Code:
    1. <?xml version="1.0" encoding="utf-8" ?>
    2.    <!-- This is list of employees -->
    3.    <employees>
    4.      <employee employeeid="1">
    5.        <firstname>Nancy</firstname>
    6.        <lastname>Davolio</lastname>
    7.        <homephone>(206) 555-9857</homephone>
    8.        <notes>
    9.          <![CDATA[includes a BA in psychology from Colorado State University in She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International.]]>
    10.     </notes>
    11.     </employee>
    12.     <employee employeeid="2">
    13.       <firstname>Andrew</firstname>
    14.       <lastname>Fuller</lastname>
    15.       <homephone>(206) 555-9482</homephone>
    16.       <notes>
    17.         <![CDATA[Andrew received his BTS commercial in 1974 and a Ph.D. in international marketing from the University of Dallas in  He is fluent in French and Italian and reads German. He joined the company as a sales representative, was promoted to sales manager in January 1992 and to vice president of sales in March Andrew is a member of the Sales Management Roundtable, the Seattle Chamber of Commerce, and the Pacific Rim Importers Association.]]>
    18.       </notes>
    19.     </employee>
    20.     <employee employeeid="3">
    21.       <firstname>Janet</firstname>
    22.       <lastname>Leverling</lastname>
    23.       <homephone>(206) 555-3412</homephone>
    24.       <notes>
    25.         <![CDATA[Janet has a BS degree in chemistry from Boston College (1984). She has also completed a certificate program in food retailing management.  Janet was hired as a sales associate in 1991 and promoted to sales representative in February 1992.]]>
    26.       </notes>
    27.     </employee>
    28.   </employees>


    Ví dụ minh họa của kỳ này: chúng ta sẽ sửa đổi 1 chút xíu ở ví dụ minh họa kỳ 4, vì đơn giản SelectSingleNode() cũng ko khác chi mấy so với SelectNodes(). Bạn chỉ cần sửa lại đoan code ở những phần sau:
    - Thay thế biến thành viên:

    PHP Code:
    XmlNodeList nodeList
    bằng biến thành viên này:

    PHP Code:
    XmlNode nodeSelect
    - Thay thế đoạn mã thụ lý tình huống Click của nút "Tìm" bằng đoạn mã mới này:

    Visual C# Code:
    1. private void Button1_Click(object sender, System.EventArgs e)
    2.  {
    3.      XmlDocument doc = new XmlDocument();
    4.      doc.Load(Application.StartupPath + "\\employees.xml");
    5.      if (RadioButton1.Checked == true) {
    6.          nodeSelect = doc.SelectSingleNode("/employees/employee[./firstname/text() = '" + TextBox1.Text + "']");
    7.      }
    8.      if (RadioButton2.Checked) {
    9.          nodeSelect = doc.SelectSingleNode("/employees/employee[./lastname/text() = '" + TextBox1.Text + "']");
    10.      }
    11.      if (nodeSelect != null) {
    12.          ComboBox1.Items.Add(nodeSelect.Attributes("employeeid").Value);
    13.      }
    14.      ComboBox1.SelectedIndex = 0;
    15.  }


    -Thay thế đoạn mã thụ lý tình huống Click của nút "Hiển thị" bằng đoạn mã mới này:

    Visual C# Code:
    1. private void Button2_Click(object sender, System.EventArgs e)
    2.  {
    3.      Label8.Text = nodeSelect.ChildNodes(0).InnerText;
    4.      Label9.Text = nodeSelect.ChildNodes(1).InnerText;
    5.      Label10.Text = nodeSelect.ChildNodes(2).InnerText;
    6.      Label11.Text = nodeSelect.ChildNodes(3).InnerText;
    7.  }

    Quả thật, không có chi khó hiểu với phương thức này, chỉ nhớ là SelectSingleNode() chỉ cho ta chọn 1 nút mà thôi! Do đó, nếu có nhập "Nancy" và trong tài liệu có nhiều nhân viên thì cũng chỉ nhận được 1 nhân viên tên Nancy mà tài liệu tìm thấy trước tiên thôi!

    Tác giả: neverland
    Keep moving forward!

    ... Retired ...

  6. #6
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định Thêm, xóa, cập nhật nút trong tài liệu xml

    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 như hình dưới:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		them_sua_xoa.png
Lần xem:	2418
Size:		11.1 KB
ID:		5205

    Ứ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:

    PHP Code:
    int chimuc 0;
         
    XmlDocument doc = new XmlDocument(); 
    Thụ lý tình huống Load của của Form:

    Visual C# Code:
    1. private void Form1_Load(object sender, System.EventArgs e)
    2.  {
    3.      doc.Load(Application.StartupPath + "\\employees.xml");
    4.      foreach (XmlNode node in doc.DocumentElement.ChildNodes) {
    5.          cboEmployeeID.Items.Add(node.Attributes("employeeid").Value);
    6.      }
    7.      cboEmployeeID.SelectedIndex = 0;
    8.      FillControls();
    9.      UpdateLabel();
    10.  }


    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:

    Visual C# Code:
    1. private void btnFirst_Click(object sender, System.EventArgs e)
    2.  {
    3.      chimuc = 0;
    4.      FillControls();
    5.      UpdateLabel();
    6.  }
    7.  
    8.  
    9.  private void btnPrevious_Click(object sender, System.EventArgs e)
    10.  {
    11.     chimuc = chimuc - 1;
    12.      if (chimuc < 0) {
    13.          chimuc = 0;
    14.      }
    15.      FillControls();
    16.      UpdateLabel();
    17.  }
    18.  
    19.  
    20.  
    21.  private void btnNext_Click(object sender, System.EventArgs e)
    22.  {
    23.      chimuc = chimuc + 1;
    24.      if (chimuc >= doc.DocumentElement.ChildNodes.Count - 1) {
    25.          chimuc = doc.DocumentElement.ChildNodes.Count - 1;
    26.      }
    27.      FillControls();
    28.      UpdateLabel();
    29.  }
    30.  
    31.  
    32.  private void btnLast_Click(object sender, System.EventArgs e)
    33.  {
    34.      chimuc = doc.DocumentElement.ChildNodes.Count - 1;
    35.      FillControls();
    36.      UpdateLabel();
    37.  }

    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:

    Visual C# Code:
    1. //Fill Controls
    2.  public void FillControls()
    3.  {
    4.      //node = nút con th? <chimuc> c?a nút g?c c?a tài li?u
    5.      XmlNode node = doc.DocumentElement.ChildNodes(chimuc);
    6.      //combobox mã s? nhân viên = giá tr? c?a attribute employeeid c?a nút con v?a tìm
    7.      cboEmployeeID.Text = node.Attributes("employeeid").Value;
    8.      //gán chu?i n?m gi?a c?p tag ?óng-m? cho các textbox thông tin
    9.      txtFirstName.Text = node.ChildNodes(0).InnerText;
    10.      txtLastName.Text = node.ChildNodes(1).InnerText;
    11.      txtHomePhone.Text = node.ChildNodes(2).InnerText;
    12.      txtNotes.Text = node.ChildNodes(3).InnerText;
    13.  }
    14.  
    15.  
    16.  //Update Label
    17.  public void UpdateLabel()
    18.  {
    19.      //doc.Document.ChildNodes.Count = s? nút con c?a nút g?c c?a tài li?u
    20.      lblRecord.Text = (chimuc + 1).ToString + "/" + doc.DocumentElement.ChildNodes.Count;
    21.  }


    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

    Visual C# Code:
    1. private void btnUpdate_Click(object sender, System.EventArgs e)
    2.  {
    3.      //ch?n 1 nút t??ng ?ng v?i mã nhân viên ???c ch?n t? cboEmployeeID
    4.      XmlNode node = doc.SelectSingleNode("employees/employee[@employeeid = '" + cboEmployeeID.SelectedItem + "']");
    5.      //n?u có nhân viên t??ng ?ng
    6.      if (node != null) {
    7.          //gán các giá tr? trong các textbox thông tin
    8.          //vào gi?a c?p tag ?óng-m? c?a các nút con c?a nút ?ang xét
    9.          //? ?ây là các tag: firstname,lastname,notes c?a nút employee
    10.          node.ChildNodes(0).InnerText = txtFirstName.Text;
    11.          node.ChildNodes(1).InnerText = txtLastName.Text;
    12.          node.ChildNodes(2).InnerText = txtNotes.Text;
    13.          //riêng v?i CData, ta ph?i làm b?ng cách t?o 1 bi?n ki?u XmlCDataSection
    14.          //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
    15.          XmlCDataSection notes = doc.CreateCDataSection(txtNotes.Text);
    16.          //thay th? CDataSection c? là : node.ChildNodes(3).ChildNodes(0)
    17.          //b?i nút notes
    18.          node.ChildNodes(3).ReplaceChild(notes, node.ChildNodes(3).ChildNodes(0));
    19.          //l?u l?i tài li?u
    20.          doc.Save(Application.StartupPath + "\\employees.xml");
    21.      }
    22.  }

    -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:

    Visual C# Code:
    1. private void btnDelete_Click(object sender, System.EventArgs e)
    2.  {
    3.      //ch?n 1 nút t??ng ?ng v?i mã nhân viên ???c ch?n t? cboEmployeeID
    4.      XmlNode node = doc.SelectSingleNode("employees/employee[@employeeid = '" + cboEmployeeID.SelectedItem + "']");
    5.      //n?u có nhân viên t??ng ?ng
    6.      if (node != null) {
    7.          //di chuy?n nút employee t??ng ?ng kh?i tài li?u
    8.          //thông qua ph??ng th?c RemoveChild(<nut can xoa>)
    9.          //c?a doc.DocumentElement
    10.          doc.DocumentElement.RemoveChild(node);
    11.      }
    12.      //l?u l?i tài li?u
    13.      doc.Save(Application.StartupPath + "\\employees.xml");
    14.      //C?p nh?t l?i s? v? trí c?a nút
    15.      UpdateLabel();
    16.  }

    -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

    Visual C# Code:
    1. private void btnAdd_Click(object sender, System.EventArgs e)
    2.  {
    3.      //khai báo các bi?n ph?n t? (XmlElement) c?a tài li?u
    4.      //?ng v?i tên c?a chúng ???c truy?n vào ph??ng th?c CreateElement
    5.      XmlElement employee = doc.CreateElement("employee");
    6.      XmlElement firstname = doc.CreateElement("firstname");
    7.      XmlElement lastname = doc.CreateElement("lastname");
    8.      XmlElement homephone = doc.CreateElement("homephone");
    9.      XmlElement notes = doc.CreateElement("notes");
    10.      //khai báo 1 bi?n t??ng tr?ng cho attribute employeeid (XmlAttribute)
    11.      //v?i tên là chu?i ???c truy?n vào ph??ng th?c CreateAttribute
    12.      XmlAttribute employeeid = doc.CreateAttribute("employeeid");
    13.      //gán giá tr? c?a cboEmployeeID vào
    14.      //bi?n attribute employeeid v?a t?o
    15.      employeeid.Value = cboEmployeeID.Text;
    16.      //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?
    17.      //v?i giá tr? là chu?i ???c truy?n vào ph??ng th?c CreateTextNode
    18.      XmlText firstnametext = doc.CreateTextNode(txtFirstName.Text);
    19.     XmlText lastnametext = doc.CreateTextNode(txtLastName.Text);
    20.      XmlText homephonetext = doc.CreateTextNode(txtHomePhone.Text);
    21.      //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
    22.      //t?o 1 bi?n ki?u XmlCDataSection
    23.      XmlCDataSection notestext = doc.CreateCDataSection(txtNotes.Text);
    24.      //ph?n t? notes thêm notestext vào b?n thân nó.
    25.      notes.AppendChild(notestext);
    26.      //ph?n t? employee thêm attribute employeeid vào b?n thân nó
    27.      employee.Attributes.Append(employeeid);
    28.      //cho ph?n t? employee có các nút con là : firstname,lastname,homephone và notes
    29.      employee.AppendChild(firstname);
    30.      employee.AppendChild(lastname);
    31.      employee.AppendChild(homephone);
    32.      employee.AppendChild(notes);
    33.      //thêm ph?n t? employee v?a t?o vào nút g?c employees c?a tài li?u
    34.      doc.DocumentElement.AppendChild(employee);
    35.      //l?u l?i tài li?u
    36.      doc.Save(Application.StartupPath + "\\employees.xml");
    37.      //c?p nh?t l?i thông tin v? trí c?a nút
    38.      UpdateLabel();
    39.  }

    Tác giả: neverland
    Keep moving forward!

    ... Retired ...

  7. #7
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định Liên hệ với khoảng trắng

    KỲ 7
    LIÊN HỆ VỚI KHOẢNG TRẮNG

    Từ đầu đến giờ, bạn đã được học về cách đọc và viết tài liệu XML sử dụng lớp XmlDocument. Trong quá trình đọc viết đó, chúng ta khó tránh khỏi sự bực mình với khoảng trắng (là ký tự khoảng trắng,tab,…) vì mặc định khi tài liệu XML được đọc (dùng phương thức Load hoặc LoadXml) hoặc lưu lại (phương thức Save), nó sẽ loại bỏ khoảng trắng (ignore white space). Kỳ này, mình sẽ chỉ cho các bạn cách đối xử đối với lũ khoảng trắng này.

    Để dễ thấy sự khác biệt giữa việc loại bỏ hay không loại bỏ khoảng trắng, chúng ta thử làm 1 ví dụ đơn giản như sau:

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		xml_7_1.png
Lần xem:	2388
Size:		6.3 KB
ID:		5206

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

    Visual C# Code:
    1. private void Button1_Click(object sender, System.EventArgs e)
    2.  {
    3.      XmlDocument doc = new XmlDocument();
    4.      doc.PreserveWhitespace = CheckBox1.Checked;
    5.      doc.Load(Application.StartupPath + "\\employees.xml");
    6.      MessageBox.Show(doc.InnerXml);
    7.  }

    Dưới đây là hình kết quả trong 2 trường hợp:
    -Khi checkbox không được chọn:

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		xml_7_2.png
Lần xem:	2395
Size:		9.5 KB
ID:		5207

    -Khi checkbox được chọn:

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		xml_7_3.png
Lần xem:	2394
Size:		12.4 KB
ID:		5208


    Okay, bây giở bạn thử thay thế dòng code:

    Visual C# Code:
    1. MessageBox.Show(doc.InnerXml);

    bởi dòng:

    Visual C# Code:
    1. MessageBox.Show("Nút employees có: " + doc.DocumentElement.ChildNodes.Count.ToString() + " nút con");


    ^_^ Bây giờ bạn thử xem kết quả sẽ như thế nào nhé?

    Tác giả: neverland
    Keep moving forward!

    ... Retired ...

  8. #8
    Ngày gia nhập
    03 2009
    Bài viết
    2

    Mặc định Thực hành xử lý XML trong .NET

    Chào các bác! E cũng đang tìm làm một project nhỏ với xml nhưng đang mắc phần xóa một node. E có file xml nội dung thế này:

    XML Code:
    1. <?xml version="1.0" encoding="utf-16"?>
    2. <wfs:FeatureCollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:new="http://localhost:8080/geoserver" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://localhost:8080/geoserver [url]http://localhost:8080/geoserver/wfs?service=WFS;version=1.0.0;request=DescribeFeatureType;typeName=new:Bao_tang[/url] [url]http://www.opengis.net/wfs[/url] http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd">
    3.   <gml:boundedBy>
    4.       <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
    5.            <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts="">105.79407768,20.99910479 105.86126965,21.04643932</gml:coordinates>
    6.     </gml:Box>
    7.   </gml:boundedBy>
    8.   <gml:featureMember>
    9.     <new:Bao_tang>
    10.       <new:the_geom>
    11.         <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
    12.           <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="" ds="">105.85141496,21.02330989</gml:coordinates>
    13.         </gml:Point>
    14.       </new:the_geom>
    15.       <new:TEN_XE>02</new:TEN_XE>
    16.       <new:TEN_LAI_XE>Sinh</new:TEN_LAI_XE>
    17.       <new:SDT>0906181284</new:SDT>
    18.       <new:DIA_CHI>YB</new:DIA_CHI>
    19.     </new:Bao_tang>
    20.   </gml:featureMember>
    21.   <gml:featureMember>
    22.     <new:Bao_tang>
    23.       <new:the_geom>
    24.         <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
    25.           <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="" ds="">105.85141496,21.02330989</gml:coordinates>
    26.         </gml:Point>
    27.       </new:the_geom>
    28.       <new:TEN_XE>04</new:TEN_XE>
    29.       <new:TEN_LAI_XE>Đỗ Tuấn Anh</new:TEN_LAI_XE>
    30.       <new:SDT>0902166740</new:SDT>
    31.       <new:DIA_CHI>Thanh Xuân</new:DIA_CHI>
    32.     </new:Bao_tang>
    33.   </gml:featureMember>
    34. </wfs:FeatureCollection>


    E thực hiện việc xóa node như sau:

    Visual C# Code:
    1.             XmlDocument doc = new XmlDocument();
    2.             FileStream fstream3 = new FileStream(xmlPath,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);
    3.             try
    4.             {
    5.                 doc.Load(fstream3);
    6.             }
    7.             catch (Exception err)
    8.             {
    9.                 MessageBox.Show(err.Message);
    10.                 return;
    11.             }
    12.             XmlNodeList ftMember = doc.GetElementsByTagName("gml:featureMember");
    13.             //MessageBox.Show(ftMember.Count.ToString());
    14.             XmlNode rootNode = doc.DocumentElement;
    15.             //MessageBox.Show(rootNode.InnerXml);
    16.             for (int i = 0; i < ftMember.Count; i++) {
    17.                 if (ftMember[i].ChildNodes[0].ChildNodes[3].InnerText == cbPhoneNo.SelectedItem.ToString()) {
    18.                     rootNode.RemoveChild(rootNode.ChildNodes[i+1]);
    19.                    
    20.                                                            
    21.                     //MessageBox.Show(rootNode.ChildNodes[i+1].OuterXml);
    22.                 }
    23.             }
    24.             fstream3.Seek(0, SeekOrigin.Begin); fstream3.Flush();
    25.             doc.Save(fstream3);
    26.             fstream3.Close();

    Nhưng kết quả không như mong muốn. Chẳng hạn e muốn xóa node đầu thì kết quả ở file xml là:

    XML Code:
    1. <gml:featureMember>
    2.     <new:Bao_tang>
    3.       <new:the_geom>
    4.         <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
    5.           <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="" ds="">105.85141496,21.02330989</gml:coordinates>
    6.         </gml:Point>
    7.       </new:the_geom>
    8.       <new:TEN_XE>04</new:TEN_XE>
    9.       <new:TEN_LAI_XE>Đỗ Tuấn Anh</new:TEN_LAI_XE>
    10.       <new:SDT>0902166740</new:SDT>
    11.       <new:DIA_CHI>Thanh Xuân</new:DIA_CHI>
    12.     </new:Bao_tang>
    13.   </gml:featureMember>
    14. </wfs:FeatureCollection>   <new:Bao_tang>
    15.       <new:the_geom>
    16.         <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
    17.           <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="" ds="">105.85141496,21.02330989</gml:coordinates>
    18.         </gml:Point>
    19.       </new:the_geom>
    20.       <new:TEN_XE>02</new:TEN_XE>
    21.       <new:TEN_LAI_XE>Sinh</new:TEN_LAI_XE>
    22.       <new:SDT>0906181284</new:SDT>
    23.       <new:DIA_CHI>YB</new:DIA_CHI>
    24.     </new:Bao_tang>
    25.   </gml:featureMembere>


    E xem dung lượng file vẫn dữ nguyên. E loay hoay mãi chưa biết lý do vì sao mà nó lại cứ thếm cái phần đuôi vào sau root node như thế. Bác nào chỉ giùm e với.
    Đã được chỉnh sửa lần cuối bởi vtsinh : 25-03-2009 lúc 09:21 AM.

  9. #9
    Ngày gia nhập
    03 2009
    Bài viết
    2

    Tại sao lại có sự khác biệt khi Save dữ liệu từ bộ nhớ vào trực tiếp file với Save thông qua một Stream nhỉ? Mình thử doc.Save(tên file) thì kết quả đúng nhưng Save(fileStream) thi lại không được. Trong khi yêu cầu là phải save vào Stream vì file đang được open. Bạn nào có cách giải quyết cho vấn đề này không.

  10. #10
    Ngày gia nhập
    02 2011
    Bài viết
    114

    childnode.Attributes("employeeid").Name
    cái này hình như không có thì phải

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn