TIN HỌC ỨNG DỤNG 2 - K11
Bạn hãy đăng ký làm thành viên để có thể xem các thông tin trong lớp và viết bài trong diễn đàn.

Không những thế, sau khi đăng ký bạn sẽ nhận được sự hỗ trợ của diễn đàn nhiều hơn.
Change background image
TIN HỌC ỨNG DỤNG 2 - K11

Khoa CNTT - ĐH Công nghiệp Hà Nội


Go downMessage [Page 1 of 1]

© FMvi.vn

on 3/10/2011, 21:21
avatar
avatar

Admin

XML (eXtensible Markup Langue) đóng một vai trò quan trọng trong
.NET. Không chỉ vì .NET cho phép bạn sử dụng XML trong các ứng dụng của
bạn, mà bản thân nó cũng sử dụng XML cho những file cấu hình và tài liệu
mã nguồn, như SOAP, các dịch vụ web và Ado.net. Do đó tìm hiểu về các
xử lý XML trong .Net với ngôn ngữ C# là một điều nên làm. Bài viết này
sẽ đi từng bước trong quá trình với những ví dụ demo cụ thể.



1. Giới thiệu về namespace System.xml (introduction to namespace System.xml)

- namespace System.xml trong .NET cung cấp một số lớp hỗ trợ cho việc xử lý XML. Dưới đây là những lớp đọc và ghi XML.

Tên lớpGiải thích
XmlReaderMột lớp đọc trừu tượng nhanh và non-cached dữ liệu XML. XmlReader được thiết kế giống như bộ phân tách SAX.
XmlWriterMột lớp viết trừu tượng nhanh và non-cached dữ liệu XML trong một dòng hoặc định dạng file.
XmlTexReaderMở rộng của XmlReader. Cung cấp chuỗi truy cập nhanh dữ liệu XML.
XmlTexWriterMở rộng của XmlWriter. Phát nhanh các dòng XML.
- Một vài lớp hữu ích khác trong XML:

Tên lớp Giải thích
XmlNodeMột lớp trừu tượng miêu tả một nút đơn trong một tài liệu XML. Lớp cơ sở cho các lớp khác trong namespace XML.
XmlDocumentMở rộng của XmlNode. Đây là một thực thi
W3C Document Object Model (DOM). Nó cung cấp một cây miêu tả tài liệu
XML trong bộ nhớ cho phép điều hướng và soạn thảo.
XmlDataDocumentMở rộng của XmlDocument. Đây là một tài
liệu có thể được tải từ dữ liệu XML hoặc từ dữ liệu trong một ADO.NET
DataSet. Cho phép hòa trộn XML và dữ liệu quan hệ trong cùng một view.
XmlResolverMột lớp trừu tượng dùng giải quyết các tài
nguyên XML ngoài như DTD và tham chiếu sơ đồ. Cũng dùng để xử lí các
thành phần .
XmlUrlResolverMở rộng của XmlResolver. Giải quyết các tài nguyên tên như một URI (Uniform Resource Identifier).
- Lưu ý: namespace xml có sẵn cho bất kỳ ngôn ngữ nào biết .NET

2. Đọc và Ghi XML (Read and write Streamed XML)

- Cả 2 lớp XmlReader và XmlWriter đều là những lớp trừu tượng. Hình dưới đây minh họa các lớp kế thừa từ 2 lớp này:

+ XmlTextReader và XmlTextWriter làm việc chung trên các đối tượng
stream hoặc các đối tượng TextReader/TextWriter trong namespace
System.IO.

+ XmlNodeReader sử dụng XmlNode cho một nguồn thay cho một stream.
XmlValidatingReader thêm DTD với sơ đồ tích hợp và tất nhiên là cả dữ
liệu hợp lệ.

2.1 Sử dụng lớp XmlTexReader

- XmlTexReader rất giống SAX. Một trong những khác biệt lớn nhất: SAX
là một mô hình kiểu push, còn XmlTextReader là một mô hình pull, ở đó
dữ liệu được kéo vào ứng dụng yêu cầu nó. Nó tạo ra một mô hình lập
trình dễ dàng và trực quan hơn. Một lợi ích khác của mô hình pull là có
thể lựa chọn dữ liệu để gởi đến ứng dụng: nếu bạn không muốn tất cả các
dữ liệu, vì không cần xử lý tất cả chúng. Còn trong mô hình push, tất cả
dữ liệu XML cần phải được xử lý bởi ứng dụng, mặc cho nó có muốn hay
không.

- Để sử dụng lớp này bạn cần khai báo :

using System.Xml;
- Đây là file “Book.xml” dùng để sử dụng trong các ví dụ của chương trình (click vào đây để download nó về máy tính để).

- Bây giờ hãy mở visual studio của bạn lên:

+ Kéo vào một ListBox và một Button như hình bên;

+ Sau đó viết sự kiện cho button Load XML như sau:

+ Click vào đây để down project demo ví dụ này viết bằng visual studio 2010

private void btnLoadXML_Click(object sender, EventArgs e)
{
// Đường dẫn tới file xml.
string fileName = "Book.xml";
// Tạo một đối tượng TextReader mới
XmlTextReader xtr = new XmlTextReader(fileName);
while (xtr.Read())
{
if (xtr.NodeType == XmlNodeType.Text)
{
listBox1.Items.Add(xtr.Value);
}
}
}


- Kết quả khi chạy chương trình trên và click vào button LoadXML như hình bên.

- XmlTextReader này sử dụng khá đơn giản.

+ Trước tiên chúng ta tạo ra một đối tượng string chứa dường dẫn tới
file xml. Sau đó tạo một đối tượng XmlTextReader mới với tham số là
đường dẫn tới file xml.

+ Khi chương trình chạy đến vòng lặp while, phương thức Read sẽ được
di chuyển sang mục tiêu đầu tiên trong tài liệu. Nó tiêu biểu cho các
mục khai báo XML. Trong ví dụ này, chúng ta duyệt qua từng mục và so
sánh xtr.NodeType với bộ XmlNodeType, và thêm các mục được tìm thấy vào
listbox.

2.2 Các phương thức Read

- Có một vài cách di chuyển trong tài liệu. Như bạn đã thấy trong ví
dụ trên, Read() có thể di chuyển sang mục tiếp theo. Chúng ta có thể xem
nêu mục đó có giá trị (HasValue()) , hoặc nếu mục đó có thuộc tính
(HasAttributes()) . Chúng ta cũng có thể dùng phương thức
ReadStartElement(), để kiểm tra xem nếu mục hiện tại là thành phần khởi
đầu, và chuyển sang mục tiếp theo. Nếu không phải là mục khởi đầu một
ngoại lệ XmlException sẽ được phát ra. Việc gọi phương thức này giống
như gọi phương thức IsStartElement(), bởi một Read().

- Các phương thức ReadString() và ReadChars() đều đọc dữ liệu văn
bản từ một thành tố. ReadString() tra về một chuỗi dữ liệu, trong khi
ReadChars() trả về một mảng dữ liệu kiểu char.

- ReadElementString() cũng giống như ReadString(), ngoại trừ việc
bạn không phải truyền tên của một thành tố. Nếu nội dung của mục tiếp
theo không phải là một start tag, hoặc nếu tham số Name không không phải
là Name của mục hiện hành, thì một ngoại lệ sẽ được phát ra.

- Dưới đây là ví dụ chỉ ra cách sử dụng ReadElementString(), lưu ý khai báo:

using System.IO;
private void btnLoadXML_Click(object sender, EventArgs e)
{ string fileName = “Book.xml”;
FileStream fs = new FileStream(fileName, FileMode.Open);
XmlTextReader xtr = new XmlTextReader(fs);
while (!xtr.EOF)
{
if (xtr.MoveToContent() == XmlNodeType.Element && xtr.Name == “title”)
{
listBox1.Items.Add(xtr.ReadElementString());
}
else
{
xtr.Read();
}
}

}

- Trong vòng lặp while chúng ta sử dụng MoveToContent() để tìm trên
mỗi dòng xem XmlNodeType.Element có giống với named title không. Chúng
ta sử dụng thuộc tính EOF của XmlTextReader như là một điều kiện lặp.
Nếu mục không phải kiểu Element của named title, mệnh đề else phát ra
một phương thức Read() để di chuyển sang mục tiếp theo. Khi chúng ta tìm
thấy một mục thỏa điều kiện, chúng ta trả kết quả của
ReadElementString() cho listbox. Nó cho phép các tựa sách được liệt kê
trong listbox. Chú ý rằng chúng ta không tạo ra một lời gọi Read() sau
khi một ReadElementString() thực hiện thành công. Bởi vì
ReadElementString() cũng sẽ di chuyển sang mục tiếp theo.

- Nếu bạn bỏ && tr.Name==”title” trong mệnh đề if, bạn sẽ
nhận được ngoại lệ XmlException. Nếu nhìn vào file dữ liệu, bạn sẽ thấy
thành tố đầu tiên mà MoveToContent() tìm ra là . Tất
nhiên nó vì nó không chứa một kiểu text chuẩn, nên ReadElementString()
phát ra một ngoại lệ XmlException.

2.3 Lấy thuộc tính của dữ liệu:

- Khi bạn chạy các ví dụ trên, bạn nhận ra rằng khi các mục được
đọc, bạn không thấy bất kì thuộc tính nào cả. Đó là vì các thuộc tính
không nằm trong tài liệu. Khi đang đứng trên một mục, bạn có thể kiểm tra các thuộc tính và có thể lấy giá trị của bất kì giá trị thuộc tính nào.

- Thuộc tính HasAttributes sẽ trả về giá trị true nếu có bất kì
thuộc tính nào còn không sẽ trả về false. Thuộc tính AttributeCount sẽ
cho bạn biết có bao nhiêu thuộc tính, và phương thức GetAttribute() sẽ
trả về một thuộc tính thông qua tên hoặc chỉ mục. Nếu bạn muốn lặp qua
các thuộc tính bạn có thể dùng các phương thức MoveToFirstAttribute() và
MoveToNextAttribute().

- Dưới đây là một ví dụ về việc lặp qua các thuộc tính.

string fileName = “Book.xml”;
FileStream fs = new FileStream(fileName, FileMode.Open);
XmlTextReader xtr = new XmlTextReader(fs);
while (xtr.Read())
{
if (xtr.NodeType == XmlNodeType.Element)
{
for (int i = 0; i < xtr.AttributeCount; i++)
{
listBox1.Items.Add(xtr.GetAttribute(i));
}
}
}

- Bây giờ chúng ta xem xét về các mục thành phần. Khi chúng ta tìm
thấy một mục, chúng ta lặp qua tất cả thuộc tính của nó, và dùng phương
thức GetAttribute() để load giá trị của thuộc tính vào listbox. Trong ví
dụ này các thuộc tính đó là genre, publicationdate, và ISBN.

2.4 Sử dụng lớp XmlValidatingReader

- Nếu bạn muốn xác nhận một tài liệu XML, bạn sẽ cần phải sử dụng
lớp XmlValidatingReader. Nó chứac các khả năng giống như XmlTextReader
(Cả hai đều xuất phát từ XmlReader) nhưng XmlValidatingReader có thêm
thuộc tính ValidationType, thuộc tính Schemas và SchemaType.

- Nếu bạn gán thuộc tính ValidationType giá trị xác nhận mà bạn
muốn. Giá trị hợp lệ của thuộc tính này được liệt kê trong bảng sau:

Property valueDescription
AutoNếu một DTD được khai báo trong một khai
báo , điều này cho phép DTD sẽ được load và xử lí. Giá
trị mặc định cho các DTD.
Nếu một thuộc tính XSD schemalocation được tìm thấy, XSD được load và xử lí, và sẽ trả về các giá trị mặc định trong sơ đồ.

Nếu một không gian tên với tiếp đầu ngữ MSXML x-schema được tìm
thấy, nó sẽ load và xử lí sơ đồ XDR và trả về các thuộc tính mặc định
đã được định nghĩa.
DTDPhù hợp theo chuẩn DTD.
SchemaPhù hợp theo sơ đồ XSD.
XDRPhù hợp theo sơ đồ XDR
NoneKhông giá trị hợp lệ nào được thực thi.
- Khi một thuộc tính trong này được chọn, Một ValidationEventHandler
cần phải được gán. Đây là một sự kiện được tạo ra do các lỗi. Bạn có
thể tác động lại lỗi theo các mà bạn cho là phù hợp.

2.5 Sử dụng Schema property

Schemas property của XmlValidatingReader chứa một
XmlSchemaCollection, có thể tìm thấy trong không gian tên
System.Xml.Schema. Tập hợp này tổ chức load lại loaded XSD và XDR
schemas. Nó cực nhanh đặc biệc là khi bạn cần kiểm tra sự hợp lệ của
nhiều tài liệu khác nhau, vì sơ đồ sẽ không được load mỗi khi kiểm tra.
Các bước sử dụng thuộc tính này như sau, bạn tạo một đối tượng
XmlSchemaCollection. Phương thức Add(), nằm trong một
XmlSchemaCollection, có bốn quá tải. Bạn có thể truyền nó cho một đối
tượng xuất phát từ XmlSchema, một đối tượng xuất phát từ
XmlSchemaCollection, một chuỗi không gian tên với chuỗi URI của file sơ
đồ và một đối tượng xuất phát từ XmlReader chứa trong sơ đồ.

2.6 Sử dụng lớp XmlTextWriter

- Lớp XmlTextWriter cho phép bạn xuất XML thành một chuỗi, một file
hoặc một đối tượng a TextWriter. Giống như XmlTextReader, nó là một
kiểu forward-only, non-cached. XmlTextWriter có thể cấu hình cao, cho
phép bạn chỉ rõ những thứ như cho phép thục đầu dòng, số thục đầu dòng,
kí tự chỉ dẫn nào được dùng trong các giá trị thuộc tính cho phép
namespace hỗ trợ.

- Hãy xem ví dụ sau, để biết cách sử dụng lớp XmlTextWriter

private void btnGhiXML_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "XML file(*.xml)|*.xml";
sfd.RestoreDirectory = true;\
if (sfd.ShowDialog() == DialogResult.OK)
{
XmlTextWriter xtw = new XmlTextWriter(sfd.FileName, null);
xtw.Formatting = Formatting.Indented;
xtw.WriteStartDocument();

// write to element HoTen
xtw.WriteStartElement("LyLich");

xtw.WriteAttributeString("QuocTich", "Viet Nam");
xtw.WriteElementString("HoTen", txtHoTen.Text);
xtw.WriteElementString("QueQuan", txtQueQuan.Text);
xtw.WriteElementString("NgaySinh", txtNgaySinh.Text);

xtw.WriteEndElement();
xtw.WriteEndDocument();
xtw.Flush();
xtw.Close();
}
}


- Chương trình demo có giao diện như sau:



Khi nhấn button ghi ra file XML thì hộp thoại saveFileDialog sẽ hiện
ra để bạn chọn đường dẫn lưu file. Bạn điền tên file rồi sau đó chọn
save thì file sẽ lưu lại với đuôi mở rộng là .xml với tên mà bạn đã đặt
cho nó.

Sau đó bạn click chuột phải vào file xml vừa được tạo ra chọn Edit thì sẽ thấy nội dung mà chương trình đã ghi ra.

- Các thành phần được điều khiển bằng việc theo dõi khi nào bạn bắt
đầu và kết thúc thao tác viết các thành phần các thuộc tính. Bạn có thể
bắt gặp chúng khi chúng ta thêm vào tên của thành phần con cho các
thành phần lớn. Chú ý việc các lời gọi phương thức WriteStartElement()
và WriteEndElement() được tổ chức như thế nào và các tổ chức các sản
phẩm các bộ thành phần trong file xuất.

- Các phương thức WriteElementString() và WriteAttributeString(),
có một vài phương thức ghi đặc biệc. WriteCData() sẽ xuất ra một đoạn
CData (), việc xuất ra các text cần một tham số.
WriteComment() xuất ra một ghi chú theo định dạng XML. WriteChars() xuất
ghi chi của của một chuỗi các kí tự. Điều này cũng tương tự phương thức
ReadChars() mà chúng ta đã biết; chúng đều sử dụng cùng các tham số.
WriteChars() cần một vùng đệm (một mảng kí tự) Vị trí bắt đầu đẻ ghi
(một số integer) số các kí tự sẽ ghi (một số integer).

- Thao tác đọc và ghi XML dùng các lớp xuất phát từ XmlReader và
XmlWriter đơn giản và mềm dẻo đến hơn chúng ta tưởng tượng rất nhiều.

- Click vào đây để download project demo việc ghi ra file XML
View user profile http://my.opera.com/anhlavip12a4/blog/

Thích

Báo xấu [0]

Gửi một bình luận lên tường nhà MinhTuan
Trả lời nhanh
on 7/10/2011, 20:39
avatar
avatar

Member

bai nay kiem dau ra the
View user profile

Thích

Báo xấu [0]

Gửi một bình luận lên tường nhà quangquy12
Trả lời nhanh

Back to topMessage [Page 1 of 1]

  © FMvi.vn

« Xem bài trước | Xem bài kế tiếp »

Bài viết liên quan

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

    You cannot reply to topics in this forum