
Đ c và ghi XML v i C# – Read and Write XML withọ ớ C#
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 pớGi i thíchả
XmlReader M 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.ượ ế ế ố ư ộ
XmlWriter M 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.ặ ị ạ
XmlTexReader M r ng c a XmlReader. Cung c p chu i truy c p nhanh d li u XML.ở ộ ủ ấ ỗ ậ ữ ệ
XmlTexWriter M 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ả
XmlNode M 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.ớ ơ ở ớ
XmlDocument M 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.ớ ề ướ ạ ả
XmlDataDocument M 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.ộ ữ ệ ệ ộ
XmlResolver M 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ế ơ ồ ể ử ầ
<xsl:include> và <xsl:import>.
XmlUrlResolver M 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à <bookstore>. 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
value
Description
Auto N u m t DTD đ c khai báo trong m t khai báo <!DOCTYPE…>, đ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.ị
DTD Phù h p theo chu n DTD.ợ ẩ
Schema Phù h p theo s đ XSD.ợ ơ ồ
XDR Phù h p theo s đ XDRợ ơ ồ
None Khô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();

