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

Tìm hiểu XML phần 3 - Một số phương pháp đọc nội dung của các Element:

Ngày đăng: 12/1/2011, 19:12:23PM | Lượt xem: 3,299
Hot!

Trong ví dụ của chúng ta ở phần trước(phần XML3), chúng ta đã sử dụng phương thức ReadElementString () để đọc nội dung từ một element. Trong phần này, bạn sẽ thấy một vài cách khác để dùng để đọc nội dung các Element

1.Một số phương pháp đọc nội dung của các Element:
Trong  ví  dụ của  chúng  ta ở phần  trước(phần  XML2),  chúng  ta    đã  sử dụng  phương  thức
ReadElementString () để đọc nội dung từ một element. Trong phần này, bạn sẽ thấy một vài cách
khác để dùng để đọc nội dung các Element
1.1) Phương pháp ReadInnerXml ()
Phương pháp ReadInnerXml () đọc tất cả nội dung bên trong các node hiện tại và trả về kết quả
như  một string.Kết quả này không bao gồm node được xét(tức là node đang dánh dấu).Lấy ví dụ
khi bạn đọc tới yếu tố đầu tiên <employee>,kết quả khi bạn dùng  ReadInnerXml () như sau:

<firstname>Nancy</firstname>
<lastname>Davolio</lastname>
<homephone>(206) 555-9857</homephone>
<notes>
<![CDATA[includes a BA in psychology from Colorado State University in 1970. She
also completed "The Art of the Cold Call." Nancy is a member of Toastmasters
International.]]>
</notes>

1.2) Phương pháp  ReadOuterXml ()
Phương pháp này tương tự như phương pháp ReadInnerXml () nhưng có sự khác biệt ở chỗ là nó
cũng bao gồm luôn việc đánh dấu các node hiện tại.Lấy lại ví dụ như trên thì bây giờ ta có được
kết quả là:

<employee employeeid="1">
<firstname>Nancy</firstname>
<lastname>Davolio</lastname>
<homephone>(206) 555-9857</homephone>
<notes>
<![CDATA[includes a BA in psychology from Colorado State University in 1970. She
also completed "The Art of the Cold Call." Nancy is a member of Toastmasters
International.]]>
</notes>
</employee>

1.3)Phương pháp ReadString()
Phương pháp ReadString () dùng đọc nội dung của các element hoặc một text node kết quả trả về
như một string. Nó hoạt động khá đơn giản,nó sẽ trả về tất cả các văn bản từ các element cho
đến khi gặp được chỗ đánh dấu.Xét lấy ví dụ sau:

<node1>
<node2>
Hello World <node3>This is some text</node3>
</node2>
</node1>

Như vậy khi bạn dùng ReadString()  bạn sẽ thu được kết quả là Helllo Word,và không xuất ra
câu This is some text,vì khi gặp chỗ <node3>(đánh dấu) quá trình đọc ngừng lại.
2.Viết tài liệu XML
Trong các phần trước,các bạn đã biết cách làm thế nào  để XmlTextReader có thể đọc tài liệu
XML.Thông thường ghi bạn biết cách đọc tài liệu XML thì bạn cũng phải biết cách viết. Lớp
XmlTextWriter cho phép bạn nhanh chóng tạo một tài liệu XML.Lớp  XmlTextWriter  là lớp kế
thừa  từ lớp trừu tượng: XmlWriter.
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.Windows.Forms;
using System.IO;
using System.Data.SqlClient;
using System.Xml;
namespace WindowsFormsApplication1
{

public partial class Form1 : Form
{

public Form1()
{
  InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
MessageBox.Show("Please enter database connection string");
return;
}
if (textBox2.Text == "")
{
MessageBox.Show("Pleasse enter table name");
return;
}
if (!Directory.Exists(Path.GetDirectoryName(textBox3.Text)))
{
MessageBox.Show("Invalid Directory");
return;

}
SqlConnection conn=null;
SqlCommand cmd = null;
SqlDataReader Reader = null;
XmlTextWriter write = null;
try
{
conn = new SqlConnection(textBox1.Text);
cmd.Connection = conn;
cmd.CommandText = "Select * From" + textBox2.Text;
conn.Open();
Reader = cmd.ExecuteReader();
//
//cung cap duong dan
//
write = new XmlTextWriter(textBox3.Text, null);
//
//bat dau viet tai lieu XML
//
write.WriteStartDocument();
write.WriteComment("File exported on" + DateTime.Now);
//
//bat dau viet cac elemeent
//
write.WriteStartElement("Table");
while (Reader.Read())
{ //
//cach viet thu nhat khong co Attribute
//
if (radioButton1.Checked)
{
write.WriteStartElement("row");
for (int i = 0; i < Reader.FieldCount; i++)
{
write.WriteStartElement(Reader.GetName(i));
write.WriteString(Reader.GetValue(i).ToString());
write.WriteEndElement();
}
write.WriteEndElement();
}
//
//cach viet thu hai co Attribute
//
else
{
write.WriteStartElement("row");
for (int i = 0; i < Reader.FieldCount; i++)
{
write.WriteAttributeString(Reader.GetName(i), Reader.GetValue(i).ToString());
}
write.WriteEndElement();
}
write.WriteEndElement();
}
}
catch(Exception ex)

{
MessageBox.Show("Error:" + ex);
}
finally
{
write.Close();
Reader.Close();
conn.Close();
}
}


}


}


Lưu ý:
- Ứng dụng trên yêu cầu bạn nhập vào một chuỗi kết nối đến cơ sở dữ liệu, một bảng dữ
liệu cần xuất  ra XML,đường dẫn lưu file XML được tạo ra.Bạn sẽ có hai lựa chọn cho
việc ghi ra file XML, các cột sẽ được ghi ra như là các element hoặc ghi theo thuộc tính
trong  tài liệu XML.
- XmlTextWriter ghi các dữ liệu như là UTF-8 (Unicode Transformation Format, 8-bit,
dưới hình thức mã hóa)
- Khi người sử dụng lựa chọn ghi dữ liệu theo kiểu element(yếu tố), tất cả các cột trong
bảng như là một element của XML, có gốc là yếu tố <table>, trong đó có chứa một hay
nhiều yếu tố <row>. Mỗi yếu tố <row> thêm sẽ chứa thêm các child element tùy thuộc
vào số lượng các cột trong bảng. Các <row> sẽ không có bất kỳ thuộc tính. Một yếu tố
mới được tạo ra bằng cách sử dụng WriteStartElement () (xem hình minh họa)
- Tương tự như vậy, khi người dùng lựa chọn ghi tất cả các cột như là thuộc tính,thì tài liệu
XML của ta có gốc <table> lại là yếu tố, trong đó sẽ chứa một hay nhiều yếu tố <row>.
Mỗi yếu tố <row> sẽ có một hoặc nhiều thuộc tính đại diện cho các cột giá trị. Các thuộc

tính này có tên giống như tên các cột trong bảng. Phương thức WriteAttributeString ()  dùng
để ghi các thuộc tính ,phương thức chấp nhận hai tham số: tên của các thuộc tính và giá trị của
các thuộc tính.(xem hình minh họa)
- Tất  cả các  tài  liệu XML  cần  phải  có  hướng  dẫn ở đầu  trang. Để làm  được  điều  này
ta  sử dụng phương thức  WriteStartDocument (). Sau đó, ta viết một comment xác định
ngày và thời gian tập tin XML đã được ghi. Phương thức WriteComment () thường được
tuyền vào một chuỗi và sau đó ta sẽ ghi chuỗi này vào tài liệu XML. Element gốc <table>
cũng được ghi vào tài liệu XML bằng việc sử dụng phương thức WriteStartElement ()
3.Xử lý đối với các kiểu dữ liệu Nontextual
Đặt vấn đề:ví dụ như bây giờ bạn muốn xây dựng cho mình một ứng dụng trong đó có sử dụng
các hình ảnh,mà bạn không muốn lưu lên ổ đĩa cứng,và cũng không muốn lưu đường dẫn trong
SQL,giải  pháp  trong  trường  hợp  này  là  bạn  có  thể mã  hóa  các  file  hình ảnh  này  rồi  lưu  lên
XML,sau đó khi muốn sử dụng nó,ta chỉ việc đọc  lại  từ file XML đã  lưu(khá hay và cần  thiết
đấy chứ hi..hi)
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.Windows.Forms;
using System.IO;
using System.Xml;
namespace WindowsFormsApplication1
{

public partial class Form1 : Form

{

public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (!File.Exists(textBox1.Text))
{
MessageBox.Show("Invalid image file name");
return;
}
if (!Directory.Exists(Path.GetDirectoryName(textBox2.Text)))
{
MessageBox.Show("Invalid Directory");
return;
}
XmlTextWriter write = new XmlTextWriter(textBox2.Text,null);
//tao mot stream den file
FileStream fs = File.OpenRead(textBox1.Text);
byte[] data = new byte[fs.Length];
fs.Close();
write.WriteStartDocument();
write.WriteStartElement("Imagefile");
//write cac Attribute
write.WriteAttributeString("filename", textBox1.Text);
write.WriteAttributeString("size", data.Length.ToString());
write.WriteBase64(data, 0, data.Length);
write.WriteEndElement();
write.Close();
}
private void button2_Click(object sender, EventArgs e)
{
if (!File.Exists(textBox2.Text))
{
MessageBox.Show("File doesn't exists!");
return;
}
XmlTextReader reader = new XmlTextReader(textBox2.Text);
reader.WhitespaceHandling = WhitespaceHandling.None;
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "filename")
{
string filename = reader.GetAttribute("filename");
//
//
int length = int.Parse(reader.GetAttribute("size"));
byte[] data = new byte[length];
//
//
string str = reader.ReadElementString();

byte[] image = Convert.FromBase64String(str);
//
MemoryStream ms = new MemoryStream();
ms.Write(image, 0, image.Length);
Image ima = Image.FromStream(ms);
pictureBox1.Image = ima;
ms.Close();
}
}
}
}

}

}


Lưu ý:
- Bạn có thể sử dụng  mã hóa hexadecimal  hoặc mã hóa Base64 , Trong ví dụ của chúng ta, chúng
tôi sử dụng mã hóa Base64.,  lớp XmlTextWriter cung cấp một phương pháp gọi là WriteBase64
()  chấp nhận ba tham số: một mảng byte chứa các nontextual dữ liệu, chỉ mục bắt đầu của các
mảng byte , và độ dài của dữ liệu để viết.
- Các nội dung của các yếu tố <imagefile> được đọc bởi bằng cách sử dụng ReadElementString () .
nó sẽ trả về 1 chuỗi được định dạng trong Base64 và cần phải được chuyển đổi trở lại vào một
mảng byte. Điều này được thực hiện với sự giúp đỡ của các FromBase64String (). Các mảng byte
trả lại từ FromBase64String () được viết vào một đối tượng MemoryStream;
Phần này kết thúc tại đây thôi

DownLoad Code

 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.