Chủ nhật, ngày 11 tháng 12 năm 2016

Tìm hiểu XML phần 3-Thao tác tập tin XML

Ngày đăng: 4/1/2011, 17:17:12PM | Lượt xem: 2,415
Hot!

Phần 1,2 chúng ta đã biết được làm thế nào để đọc,tìm kiếm trên XML,nhưng chưa biết làm sao để thay đổi nội dung của chúng,trong thực tế việc sửa đổi và bổ sung các thông tin vào XML là khá cần thiết và quan trọng

1.Thao tác tập tin XML
Phần 1,2 chúng ta đã biết được làm thế nào để đọc,tìm kiếm trên XML,nhưng chưa biết làm sao để
thay đổi nội dung của chúng,trong thực tế việc sửa đổi và bổ sung các thông tin vào XML là khá
cần thiết và quan trọng,cho nên chúng ta cần phải nắm vững các thao tác này,để hiểu rõ thêm vấn
đề chúng ta sẽ xây dựng một ứng dụng minh họa như sau:
Các chức năng của ứng dụng này:
- Cho phép hiển thị thông tin nhân viên đầu tiên,tiếp theo hay cuối cùng qua việc thao tác
với các button
- Thêm một nhân viên
- Sửa đổi thông tin một nhân viên(lưu ý employeeID  là một thuộc tính của tài liệu XML
nên ta không thể thay đổi được)
- Xóa một nhân viên hiện có
Code đầy đủ của chương trình

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
XmlDocument doc = new XmlDocument();
int CurrentNodeIndex = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
doc.Load(Application.StartupPath + "/employees.xml");
foreach (XmlNode node in doc.DocumentElement.ChildNodes)
{
comboBox1.Items.Add(node.Attributes["employeeid"].Value);
}
fillcontrols();
}
private void fillcontrols()
{
XmlNode node = doc.DocumentElement.ChildNodes[CurrentNodeIndex];
comboBox1.Text = node.Attributes["employeeid"].Value;
textBox1.Text = node.ChildNodes[0].InnerText;
textBox2.Text = node.ChildNodes[1].InnerText;
textBox3.Text = node.ChildNodes[2].InnerText;
textBox4.Text = node.ChildNodes[3].InnerText;
updatelabel();
}
private void updatelabel()
{
label6.Text = "Employeee" + (CurrentNodeIndex + 1).ToString() + "
of " + doc.DocumentElement.ChildNodes.Count.ToString();
}
//
//thao tac voi button hien thi employee first
//
private void button4_Click(object sender, EventArgs e)
{
CurrentNodeIndex = 0;
fillcontrols();
}
//
//thao tac voi button hien thi employee last
//
private void button7_Click(object sender, EventArgs e)
{
CurrentNodeIndex = doc.DocumentElement.ChildNodes.Count -1;
fillcontrols();
}
//
//thao tac voi buttton pre employee
//
private void button5_Click(object sender, EventArgs e)
{
if (CurrentNodeIndex > 0)
{
CurrentNodeIndex--;
fillcontrols();
}
else
return;
}
//
//thao tac voi button next employee
//
private void button6_Click(object sender, EventArgs e)
{
if (CurrentNodeIndex < doc.DocumentElement.ChildNodes.Count - 1)
{
CurrentNodeIndex++;
fillcontrols();
}
else
return;
}
//
//thao tac voi button add
//
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text
== "" || textBox4.Text == "")
{
MessageBox.Show("Please enter all details about employee");
return;
}
//khoi tao cac các Xmlelemment
XmlElement employee  =  doc.CreateElement("employee");
XmlElement firstname =  doc.CreateElement("firstname");
XmlElement lastanme  =  doc.CreateElement("lastname");
XmlElement homephone =  doc.CreateElement("homephone");
XmlElement notes     =  doc.CreateElement("nodes");
//khoi tao Attribute
XmlAttribute employeeid = doc.CreateAttribute("employeeid");
employeeid.Value = comboBox1.Text;
//khoi tao cac Xmltext
XmlText firstnametext = doc.CreateTextNode(textBox1.Text);
XmlText lastnametext  = doc.CreateTextNode(textBox2.Text);
XmlText homephonetext = doc.CreateTextNode(textBox3.Text);
XmlCDataSection notestext =
doc.CreateCDataSection(textBox4.Text);
//them vao cac noi dung
employee.Attributes.Append(employeeid);
employee.AppendChild(firstname);
employee.AppendChild(lastanme);
employee.AppendChild(homephone);
employee.AppendChild(notes);
//them cac text vao cho cac element
firstname.AppendChild(firstnametext);
lastanme.AppendChild(lastnametext);
homephone.AppendChild(homephonetext);
notes.AppendChild(notestext);
//them vao file XML
doc.DocumentElement.AppendChild(employee);
doc.Save(Application.StartupPath + "/employees.xml");
updatelabel();
}
//
//Thao tac voi button update
//
private void button2_Click(object sender, EventArgs e)
{
if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text
== "" || textBox4.Text == "")
{
MessageBox.Show("Please enter all Details employee");
return;
}
XmlNode node =
doc.SelectSingleNode("//employee[@employeeid='"+comboBox1.SelectedItem+"']");
if (node != null)
{
node.ChildNodes[0].InnerText = textBox1.Text;
node.ChildNodes[1].InnerText = textBox2.Text;
node.ChildNodes[2].InnerText = textBox3.Text;
XmlCDataSection notes =
doc.CreateCDataSection(textBox4.Text);
node.ChildNodes[3].ReplaceChild(notes,
node.ChildNodes[3].ChildNodes[0]);
}
doc.Save(Application.StartupPath + "/employees.xml");
}
private void button3_Click(object sender, EventArgs e)
{
XmlNode node = doc.SelectSingleNode("//employee[@employeeid='" +
comboBox1.SelectedItem + "']");
if (node != null)
{
doc.DocumentElement.RemoveChild(node);
doc.Save(Application.StartupPath + "/employees.xml");
}
updatelabel();
}
}
}


Giao diện chính của chương trình   

Lưu ý:
- Đầu tiên khi ban đầu Load chương trình,các combobox,textbox và label sẽ được fill đầy
thông tin,các thông tin này được lấy từ file employees.xml
- Các nút first,next,pre và last được code khá đơn giản nhờ vào việc sử dụng biến
CurrentNodeIndex để chỉ đến các thông tin liên quan trong XML
- Đối với button Add chức năng chính của nó là ban đầu sẽ tạo ra các element
<employee>, <firstname>, <lastname>, <homephone>, và <notes> thông qua phương
thức  CreateElement (),nên nhớ rằng  class XmlElement  là một dạng kế thừa từ các lớp
XmlNode.Sau đó ta sẽ gán các giá trị cần thiết ban đầu là employeeid(thuộc class
XmlAttribute),tiếp theo sẽ gán lần lượt là các element còn lại.Đặc biệt có element Notes
chứa thông tin(dạng CDATA) nên nó thuộc class XmlCDataSection.Phương thức
AppendChild () là một trong những phương pháp thường được sử dụng của class
XmlNode,nó cho phép các node có thể tạo thêm node con cho chính nó .Các quá trình
còn lại là thêm vào nội dung.Sau khi làm xong nhớ save lại.
- Đối với button Update ban đầu ta sẽ tìm kiếm node cần update thông qua phương thức
tìm kiếm SelectSingleNode() đã được trình bày khá chi tiết ở phần XML1 trong tut
này.Quá trình tìm kiếm sẽ dựa vào thuộc tính Attribute,sau khi tìm thấy rồi ta sẽ cập nhập
thông tin.Riêng đối với element Notes vì nó thuộc class XmlCDataSection nên ta không
gán trực tiếp như mấy cái khác được mà phải tạo mới trước,sau đó sử dụng phương thức
ReplaceChild() để thay thế.Làm xong nhớ save.
- Đối với button Delete thì  việc xử lý khá dễ dàng,ta tìm kiếm như trường hợp button
update trước,sau đó tìm thấy rồi ta sử sụng phương thức RemoveChild() để xóa.
2.Tìm hiểu kỹ về Reading and Writing in XML(nội dung chính quan trọng)
2.1)Khái quát
Theo như phần kiến  thức đã được  trình bày ở bài XML1  thì DOM cũng có  thể đọc,ghi  tài  liệu
XML,nhưng chỉ thích hợp với những  tài  liệu có kích  thước nhỏ,đối với những  tài  liệu có kích
thước lớn nó sẽ gặp vấn đề về bộ nhớ và quá trình thi hành.Chính vì những khuyết điểm trên mà
.Net Framework cung cấp cho ta XmlReader có chức năng đọc tài liệu XML,các lớp XmlReader
không nạp toàn bộ tài liệu vào bộ nhớ,nhờ vậy ta không tốn nhiều bộ nhớ,cũng giống như class
XmlReader nhưng XmlWriter chỉ có chức năng ghi. XmlReader và XmlWriter là nhữn lớp trừu
tượng,như vậy ta không thể sử dụng trực tiếp trong quá trình code.May mắn là trong namespace
System.Xml  có chứa hai cơ sở kế thừa từ các lớp trên là  XmlTextReader và XmlTextWriter
2.2)Khi nào ta cần sử dụng Readers and Writers
Trong phần trước ta đã biết về DOM,nhưng nó không phải là sự lựa chọn hay khi tài liệu XML
của ta có kích thước lớn.
Ta sử dụng Readers khi:
- Mục đích của ta chỉ là đọc tài liệu XML
- Tài liệu có kích thước rất lớn
- Chúng ta cần giữ chân bộ nhớ,tức là muốn bộ nhớ được sử dụng tối thiểu
- Khi làm việc với nhiều tài liệu XML có kích thước hợp lý
- Không muốn truy cập vào các thành phần khác của tài liệu một cách ngẫu nhiên
Ta sử dụng Writers khi:
- Bạn chỉ muốn viết nội dung
- Bạn không muốn hao tốn nhiều tài nguyên bộ nhớ
- Bạn muốn viết một tài liệu XML có kích thước rất lớn và quá trình thực thi được tối ưu.
2.3) Reader Classes
Bởi vì class XmlReader  là một class  trừu  tượng,vì  thế ta không  thể sử dụng  trực  tiếp  trong các
ứng dụng của ta được.Muốn sử dụng nó bạn cần phải kế thừa nó,.NET cung cấp cho ta 3 thể hiện
của class,chúng ta sẽ tìm hiểu vắn tắt như sau
2.3.1 The XmlTextReader Class
Các XmlTextReader có thể được sử dụng để phân tích tài liệu XML.Class này có khả năng phân
tích tài liệu rất nhanh . Nó kiểm tra các cơ sở hình thành tài liệu rất tố, nhưng không xác nhận
tính hợp lệ đó.
2.3.2 The XmlValidatingReader Class
Các XmlValidatingReader Class kiểm tra tính hợp lệ của tài liệu XML
2.3.3 The XmlNodeReader Class
Các XmlNodeReader cho phép bạn đọc dữ liệu từ XML DOM (cây). Các constructor của
XmlNodeReader có một tham số của loại XmlNode. XmlNode này có thể được lấy như là một
kết quả của một XPath truy vấn hoặc trực tiếp từ một tài liệu DOM.
Vì tính phổ biến và thông dụng,ta sẽ tìm hiểu kỹ phương pháp đọc sử dụng class XmlTextReader
2.3.4Tìm hiểu về XmlTextReader
a.Mở một tài liệu XML
Xét ví dụ sau:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Xml;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
MessageBox.Show("Please Please specify path or string");
return;
}
XmlTextReader reader;
try
{
if (radioButton1.Checked)
{
reader = new XmlTextReader(textBox1.Text);
}
if (radioButton2.Checked)
{
FileStream stream = File.OpenRead(textBox1.Text);
reader = new XmlTextReader(stream);
stream.Close();
reader.Close();
}
if (radioButton3.Checked)
{
MemoryStream ms = new MemoryStream();
byte[] data =
ASCIIEncoding.ASCII.GetBytes(textBox1.Text);
ms.Write(data, 0, data.Length);
reader = new XmlTextReader(ms);
ms.Close();
reader.Close();
}
MessageBox.Show("XML Document Opened Successfully!");
}
catch (Exception ex)
{
MessageBox.Show("Error:" + ex);
}
}
}
}

Lưu ý: Trong  ví  dụ trên  ta  chú  ý ở trường  hợp  của  radioButton3,hai  trường  hợp  đầu  của
radioButton1 và radioButton2 hoàn toàn tương tự khi thao tác với DOM đã được trình bày, các
class XmlReader   có  thể đọc một  tài  liệu XML  từ một URL hoặc một strean. Stream có  thể là
một FileStream hay MemoryStream. Các  lớp XmlReader không  thể đọc XML strings  trực  tiếp
được,do vậy trong trường hợp thứ raidoButton3 để đọc một string từ MemoryStream, ta sử dụng
phương  thức GetBytes () để chuyển đổi một string về một mảng byte. Mảng   dữ liệu kiểu byte
này  sẽ được  ghi  vào  MemoryStream.Cuối  cùng  MemoryStream  cung  cấp  dữ liệu  này  cho
constructor của lớp XmlTextReader .

if (radioButton3.Checked)
{
MemoryStream ms = new MemoryStream();
byte[] data =
ASCIIEncoding.ASCII.GetBytes(textBox1.Text);
ms.Write(data, 0, data.Length);
reader = new XmlTextReader(ms);
ms.Close();
reader.Close();
}
b. Đọc các  Attributes, Elements, and Values
Xét ví dụ sau:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
XmlTextReader reader = new XmlTextReader(Application.StartupPath
+ @"\employees.xml");
reader.WhitespaceHandling = WhitespaceHandling.None;
TreeNode employeenode=null;
TreeNode rootnode = null;
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "employees")
{
rootnode = treeView1.Nodes.Add("Employees");
}
if (reader.Name == "employee")
{
string employeeid =
reader.GetAttribute("employeeid");
employeenode = new TreeNode("Employee ID :" +
employeeid);
rootnode.Nodes.Add(employeenode);
}
if (reader.Name == "firstname")
{
string firstname = reader.ReadElementString();
TreeNode node = new TreeNode(firstname);
employeenode.Nodes.Add(node);
}
if (reader.Name == "lastname")
{
reader.Read();
string lastname = reader.Value;
TreeNode node = new TreeNode(lastname);
employeenode.Nodes.Add(node);
}
if (reader.Name == "homephone")
{
string homephone = reader.ReadElementString();
TreeNode node = new TreeNode(homephone);
employeenode.Nodes.Add(node);
}
if (reader.Name == "notes")
{
string notes = reader.ReadElementString();
TreeNode node = new TreeNode(notes);
employeenode.Nodes.Add(node);
}
}
}
reader.Close();
}
}
}

Lưu ý:
Chương trình trên giúp ta tìm hiểu làm thế nào để đọc các thuộc tính, thành phần, một  văn bản
của nodes từ một tài liệu XML bằng cách sử dụng XmlTextReader . Nhấp vào nút  Tải cây nó sẽ
hiển thị toàn bộ các nodes trong cây.
- Thuộc  tính  WhitespaceHandling    của  XmlTextReader  điều  hành  vi  của  người  đọc
trong khi đọc qua   các khoảng  trắng, WhitespaceHandling   có ba giá  trị: Tất cả, Không
có, hoặc Một. Chúng  ta đặt WhitespaceHandling bỏ qua bất kỳ khoảng  trắng nào. Điều
này sẽ đơn giản hóa việc mã hóa của chúng ta.
- Một vòng  lặp  liên  tục gọi Read  () phương thức XmlTextReader. Phương    thức   Read()
đọc  tiếp  theo  node  từ file  và  trả về đúng  nếu  node  tiếp  theo  có  thể được  đọc  thành
công,ngược lại  nó trả về sai.
- Thuộc  tính  NodeType  là  một  enumeration  của  XmlNodeType  có  thể có  giá  trị như:
Attribute,  CDATA,  Comment,  Element,  EndElement,  Text,  Whitespace,
SignificantWhitespace, vv.
- Trong ví dụ trên, ta chỉ quan tâm ở yếu tố bắt đầu  vì vậy điều kiện kiểm tra chỉ cho một
node là loại Element.Theo như  ví dụ trên ta kiểm tra tên của mỗi yếu tố.

DownLoad ứng dung kèm theo
Phần này kết thúc tại đây nha.
P/s: Bài viết trên dựa theo ebook Beginning  XML  with C#2008

 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.