Đ 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 pGi 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 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();