Do An

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 16

I.

Giới thiệu về LINQ to XML

1.Khái niệm về LINQ

LINQ là viết tắt của Language Integrated Query tạm dịch là ngôn ngữ tích hợp truy vấn
là một sự đổi mới trong Visual Studio 2008 và .net Framework 3.5 là cầu nối giữa
khoảng cách giữa thế giới các dối tượng với thế giới dữ liệu. Linq cung cấp một cách
đồng nhất để lấy dữ liệu từ bất kỳ đối tượng nào mà thực thi giao tiếp
IENUMERABLE<T>. Với LINQ mảng, collection, dữ liệu quan hệ và XML tất cả là cá
nguồn dữ liệu

2.Cấu trúc một biểu thức LINQ

 Có được dữ liệu nguồn


 Tạo các truy vấn
 Thực hiện các truy vấn

3. Tại sao phải sử dụng LINQ to XML

Theo quan điểm của các nhà phát triển thì XML không là thứ dễ quản lý vì DOM không
phải là thư viện dễ sử dụng.DOM framework thường yêu cầu bạn phải viết nhiều code để
chỉ xuất ra một tài liệu nhỏ.Hơn nữa nếu bạn cần tìm kiếm một thành phần đặc biệt trong
một tài liệu XML bạn phải sử dụng các tính năng của DOM như Xpath dựa trên cú pháp
truy vấn không trực quan.Xpath sử dụng mô hình tìm kiếm mà không giống như các ngôn
ngữ truy vấn khác như SQL và bạn phải tốn thời gian để học nó.

Để xóa bỏ những phức tạp đó thì LINQ to XML.NET đã đưa ra thư viện riêng của nó để
quản lý XML nhưng LINQ to XML tiến xa hơn nó tích hợp các điều khiển truy vấn
chuẩn với các tài liệu XML.Hơn nữa LINQ to XML đưa ra các lớp giúp cho việc tạo tài
liệu XML dễ dàng hơn.

II.Truy vấn XML

Từ khi LINQ to XML hỗ trợ các điều khiển truy vấn chuẩn LINQ một tài liệu XML có
thể được nạp trong bộ nhớ và sau đó được truy vấn với cú pháp truy vấn LINQ thông
dụng.

Chúng ta bắt đầu bằng việc phân tích một truy vấn đơn giản sử dụng hia lớp quan trọng
trong LINQ to XML.Ví dụ bên dưới là một đại diện XML cho cơ sở dữ liệu về người
(people)
Ví dụ 1

<?xml version = “1.0” encoding=”utf8”?>

<people>

<!--person section--!>

<person>

<id>1</id>

<firstname>HOA</firstname>

<lastname>TRAN</lastname>

<idrole>1</idrole>

</person>

<person>

<id>2</id>

<firstname>HIEU</firstname>

<lastname>LE</lastname>

<idrole>2</idrole>

</person>

<person>

<id>3</id>

<firstname>THU</firstname>

<lastname>PHAM</lastname>

<idrole>3</idrole>

</person>

<person>

<id>4</id>
<firstname>THUY</firstname>

<lastname>NGUYEN</lastname>

<idrole>4</idrole>

</person>

<!--Role section--!>

<role>

<id>1</id>

<roledescription>Manager</ roledescription>

</role>

<role>

<id>2</id>

<roledescription>Deverloper</ roledescription>

</role>

<!--Salary section--!>

<salary>

<idperson id=”1” year=”2004” salaryyear=”10000,0000/>

<idperson id=”1” year=”2005” salaryyear=”15000,0000/>

</salary>

</people>

Trong ví dụ 1 lớp XDocument cung cấp phương thức Elements mà trả về các phần tử từ
lớp XElement mô tả toàn bộ nội dung của thư viện LINQ to XML.Một đối tượng
XElement là tượng trưng của một element trong một tài liệu XML. Mỗi thẻ cũng như
mỗi nhánh trong tài liệu XML là một element.Bạn có thể nhìn thấy từ code trong ví dụ 2
để lưu trữ một giá trị element bạn phải sử dụng lặp đi lặp lại một phương thức
Elements.Sử dụng phương thức Elements được cung cấp bởi lớp Xelement bạn có thể
lấy một tập hợp các element và lặp lại.Vì vậy bằng cách nối việc gọi phương thức
Elements(“person”) đến việc gọi phương thức Elements(“people”) bạn có thể lấy cả bốn
thành phần person trong tài liệu XML

Điều kiênWhere để lọc các thành phần person để lấy ra một người được nhận dạng là
giống với người đó.

Ví dụ 2 Lấy ra một bảng ghi person từ tài liệu XML

XDocument xml= XDocument.Load(@”…\...\People.xml”);

Var query=from p in xml.Elements(“people”). Elements(“person”)

Where (int)p.Element(“id”)==1

Select p;

Foreach(var recode in query)

Console.WriteLine(“person:{0} {1},

Recode.Element(“firstname”).Value,

Recode.Element(“firstname”).Value;

Cuối cùng là toán tử foreach duyệt qua các element và inra tên của mỗi người.Bạn sử
dụng thuộc tính Value để lấy một giá trị của element.Lớp XDocument rất gần với lớp
Xelement (nó giống nhau về các phương thức, các thuộc tính….)nhưng nó tượng trưng
cho một thành phần goccs của một tài liệu XML.Trong ví dụ đối tượng XDocument
tượng trưng cho thành phần people.Phương thức Load sẽ nạp tài liệu XML vào bộ nhớ
cho phép chúng ta sử dụng đối tượng XDocument để truy vấn.Nếu bạn không quan tâm
vào thành phần gốc mà chỉ muốn đi ngay vào một thành phần riêng biêt nào đó bạn có
thể sử dụng phương thức Load của lớp Xelement.Trong ví dụ 3 bạn có thể thấy truy vấn
tương tự sử dụng nguồn dữ liệu XML nhưng sử dụng code ít hơn.

Ví dụ 3: Lấy dữ liệu person sử dụng code ngắn hơn

XElement xml= XElement.Load(@”…\...\People.xml”);


Var query=from p in xml. Elements(“person”)

Where (int)p.Element(“id”)==1

Select p;

Foreach(var recode in query)

Console.WriteLine(“person:{0} {1},

Recode.Element(“firstname”),

Recode.Element(“firstname”);

Bạn có thể tìm kiếm trực tiếp cho các bản ghi person mà không cần việc gọi phương thức
Element cho thành phần gốc.Hơn thế nữa nếu bạn quên hoặc bỏ sót thuộc tính Value bạn
có thể gọi phương thức ToString cái này trả về thành phần đầy đủ trong thẻ bắt đầu và thẻ
kết thúc

1.Tìm kiếm giá trị thuộc tính

Đoạn code sau đây cho thấy thông tin salary được lưu trữ trong các thuộc tính ipperson:

<salary>

<idperson id=”1” year=”2004” salaryyear=”10000,0000/>

<idperson id=”1” year=”2005” salaryyear=”15000,0000/>

</salary>

LINQ to XML cung cấp một cách để truy vấn các thành phần bởi các thuộc tính đó.Xem
ví dụ 4 bạn sẽ thấy

Ví dụ 4:Truy vấn giá trị thuộc tính

XElement xml= XElement.Load(@”…\...\People.xml”);


Var query=from s in xml. Elements(“salary”).Element(“ipperson”)

Where (int)s.Attribute(“year”)==2004

Select s;

Foreach(var recode in query)

Console.WriteLine(“Amount:{0} ,(string)

Recode.Attribute(“salaryyear”);

Lớp XAttibute tượng trưng cho các thuộc tính của một element trong một tài liệu
XML.Phương thức Attibute trả về giá trị của thuộc tính

2.Phương thức Descendants và Ancestors

Khi các element được lồng vào nhiều trong một tài liệu XML bạn có thể sử dụng phương
thức Descendant để duyệt nahnh đến các element mong muốn.Ví dụ 5 cho thấy cách để
xuống vào bên trong các thành phần lồng nhau sử dụng cách này nhanh hơn.

Ví dụ 5:sử dụng phương thức Descendants để duyệt nhanh một cây XML

XElement xml= XElement.Load(@”…\...\People.xml”);

Var query=from p in xml. Descendants (“person”)

Joins in xml. Descendants(“ipperson”)

On(int)p.Element(“id”)equals(int)s.Attribute(“id”)

Select new{Firstname=p.Element(“firstname”).Value,

Lastname= p.Element(“lastname”).Value,

Amount=s. Attribute(“salaryyear”).Value};

Foreach(var recode in query)

Console.WriteLine(“person:{0}{1},salary{2}”,
Recode.Firstname,

Recode.Lastname,

Recode.Amount);

Code trong ví dụ trên nối hai section trong nguồn dữ liệu XML:person và salary.Như bạn
có thể nhìn thấy cú pháp truy vấn tương tự nhau sử dụng các đối tượng trong bộ nhớ và
các bảng cơ sở dữ liệu.

Ngược lại phương thức Ancestors duyệt qua một cây XML cho đến khi nó đạt tới thành
phần gốc.Trong ví dụ 6 cả hai phương thức được sử dụng để duyệt tài liệu XML

Ví dụ 6: Sử dụng phương thức Descendants và Ancestors để duyệt cây tài liêu XML

XElement xml= XElement.Load(@”…\...\People.xml”);

Var recode= xml. Descendants (“firstname”).First();

Foreach(var tg in recode. Ancestors())

Console.WriteLine(tg.Name);

Đầu tiên phương thức Descendants trả về tập hợp của các thành phần firstname,tuy nhiên
nếu chúng ta sử dụng toán tử chuẩn First chỉ thành phần đầu tiên được lấy ra.Con trỏ
trong cây XML bây giờ chỉ đến thành phần firstname đầu tiên lưu trữ giá trị HOA vì thế
nếu chúng ta sử dụng phương thức Ancestors để đạt đến đỉnh của tài liệu tập hợp các
phần tử của Xelement sẽ lưu trữ trong hai nhãn:person và people

3.Truy vấn một tài liệu XML sử dụng

4.Phương thức ElementBeforSelf và ElementAfterSelf

Những phương thức này cần thiết để lấy các thành phần con bắt đầu từ các nut hiện
hành.Điều này dễ dàng làm được bằng cách sử dụng Phương thức ElementBeforSelf và
ElementAfterSelf.Những phương thức này lấy một tập hợp các phần tử anh em mà đưa ra
trước thành phần hiện hành và sau thành phần hiện hành tương ứng riêng từng cái.Ví dụ
sau là hoạt động cảu hai phương thức

Ví dụ 7: Sử dụng phương thức ElementBeforSelf và ElementAfterSelf


XElement xml= XElement.Load(@”…\...\People.xml”);

Xelement firstName=xml.Descendant(“firstname”).First();

Console.WriteLine(tag.Name);

Console.WriteLine(“”);

Console.WriteLine(“After<firstname>”);

Foreach(var tag in firstName. ElementAfterSelf())

Console.WriteLine(tag.Name);

Sau khi chúng ta đã xác định vị trí con trỏ qua thành phần firstname,việc gọi hai phương
thức sẽ xuất ra màn hinh như sau

5.Những chức năng khác nhau

Lớp Xelement cung cấp những tính năng hữu dụng dễ dàng truy cập những thông tin của
tài liệu XML

5.1 Parent

Thuộc tính này cho phép chúng ta lấy thành phần cha của thẻ hiện hành như trong ví dụ
sau

Ví dụ 8:Sử dụng thuộc tính Parent để lấy nut parent của thành phần firstname

XElement xml= XElement.Load(@”…\...\People.xml”);

Xelement firstName=xml.Descendant(“firstname”).First();

Console.WriteLine(firstName.Parent);
Thẻ cha của firstname là person kết quả xuất của đoạn code này sẽ là thành phần person
đầy đủ. Xem kết quả xuất bên dưới

5.2HasElement và HasAttribute

Những thuộc tính này kiểm ta nếu như thành phần hiện hành có những thành phần con
hay những thuộc tính con,xem ví dụ bên dưới

Ví dụ 9:sử dụng HasElements và HasAttributes để kiểm tra nếu node hiện hành có những
thành phần con hoặc thuộc tính con

XElement xml= XElement.Load(@”…\...\People.xml”);

Xelement firstName=xml.Descendant(“firstname”).First();

Console.WriteLine(“FirstName tag has attributes:{0}”,

firstName. HasAttributes);

Console.WriteLine(“FirstName tag has child element:{0}”,

firstName. HasElements);

Console.WriteLine(“FirstName tag’s parent has attributes:{0}”,

firstName. Parent. HasAttributes);

Console.WriteLine(“FirstName tag’s parent has child element:{0}”,

firstName. Parent. HasElements);

Sau khi con trỏ tới thành phàn firstname đầu tiên bằng việc sử dụng phương thức
Descendants. Tính năng HasElements và HasAttributes nếu hai thành phần firstname và
cha của nó có những thuộc tính và các thành phần con.Hình 3 là kết quả xuất của đoạn
code trên
Hình 3

5.3 IsEmpty

Tính năng này kiểm tra nếu thành phần hiện hành chứa một giá trị hoặc không chứa nghĩa
là trống

Ví dụ 10:sử dụng tính năng IsEmpty nếu một vài thành phần là trống

XElement xml= XElement.Load(@”…\...\People.xml”);

XElement firstName=xml.Descendant(“firstname”).First();

Console.WriteLine(“FirstName tag has attributes:{0}”,

firstName. HasAttributes);

Console.WriteLine(“Is FirstName tag empty ? :{0}”,

firstName.IsEmpty?”Yes”:”No”);

XElement idPerson= xml.Descendant(“idperson”).First();

Console.WriteLine(“Is idperson tag empty ? :{0}”,

idPerson.IsEmpty?” Yes”:”No”);

Hình 4 là kết quả xuất ra của đoạn code trên.Nếu bạn nhìn vào nguồn dữ liệu XML ở ví
dụ 1 bạn sẽ thấy rằng thành phần firstname là không trống bởi vì nó lưu trữ giá trị
HOA.Bạn cũng sẽ nhìn thấy nhãn ipperson là trống chỉ chứa thuộc tính

Hình 4:
5.4 Declaration

Sử dụng tính năng này chúng ta có thể lấy thông tin xề tài liệu XML.Trong ví dụ sau
chúng ta load tài liệu XML sử dụng lớp XDocument vì nó đầy đủ vì nó đầy đủ các lớp
LINQ to XML với tất cả những thông tin có khả năng thực hiện được như XML
declaration,namespace….Trong ví dụ này chúng ta sử dụng tính năng Declaration để lấy
thông tin về encoding, version, standalone từ lời khai báo XML

Ví dụ 11:Sử dụng tính năng Declaration

XDocument xml= XDocument.Load(@”…\...\Hello_LINQ to XML.xml”);

Console.WriteLine(“Encoding:{0}”, xml.Declaration.Encoding);

Console.WriteLine(“Version:{0}”, xml.Declaration.Version);

Console.WriteLine(“Standalone:{0}”, xml.Declaration.Standalone);

Hình 6: Kết quả xuất

III. Tạo và điều khiển tài liệu XML

LINQ to XML không chỉ cung cấp các truy vấn nó còn cung cấp cho việc khởi tạo và
điều khiển các tài liệu XML.Nhờ đặc điểm được gọi là functional construction bạn có thể
tạo những tài liệu XML một cách dễ dàng hơn là với thư viện W3C DOM. Chúng ta sẽ sử
dụng functional construction để tạo một tài liệu XML từ scratch và sau đó sử dụng những
đặc điểm hay tính năng của LINQ to XML để quản lý nó .

1.Tạo một tài liệu XML từ Scratch

Nếu bạn đã quen với việc sử dụng thư viện WC3 DOM hoặc .NET Framework bạn sẽ
thấy LINQ to XML rất dễ và trực quan hơn để sử dụng.Chỉ với các đoạn code rất đơn
giản bạn có thể tạo ra những thành phần mơi như ví dụ sau

Ví dụ 12:

XElement xml = new Xelement (“people”,

new Xelement (“person”,

new Xelement (“id”1),

new Xelement (“firstname”,”HOA”),

new Xelement (“lastname”,”TRAN”),


new Xelement (“idrole”,2)));

Mô hình functional construction cho phép chúng ta sử dụng những lớp LINQ to XML
trong một cách “linked”.Bạn có thể tạo những đối tượng với một cấu trúc phân cấp mà nó
tương tự được sử dụng trong một tài liệu XML.Hơn thế nữa nó là một top-down
approach làm cho việc khởi tạo một tài liệu XML trực quan hơn bottun-up approach của
thư viện W3C.Vì vậy thành phần khởi tạo đầu tien là gốc,people:

XElement xml = new Xelement (“people”,

Đến phương thức khởi tạo của nó chúng ta có thể thông qua đối tượng XElement khác
(person) mà sẽ trở thành thành phần con của people:

XElement xml = new Xelement (“people”,

new Xelement (“person”,

Chúng ta thông qua các đối tượng XElement khác đến các constructor của person để định
nghĩa những thành phần con của nó.

new Xelement (“id”1),

new Xelement (“firstname”,”HOA”),

new Xelement (“lastname”,”TRAN”),

new Xelement (“idrole”,2)));

Tài liệu xml sẽ như sau:

<people>

<person>

<id>1</id>

<firstname>HOA</firstname>

<lastname>TRAN</lastname>

<idrole>2</idrole>

</person>

</people>
Function Construction dựa trên constructor của lớp XElement cái mà đảm nhận một
mãng của những đối tượng param

Public XElement (XName name, params object[] contents)

Vì constructor này đảm nhận một mảng của các kiểu đối tượng chung, chúng có thể
thông qua nó bất kỳ thông tin nào chẳng hạn như sau:

Một đối tượng XElement sẽ được thêm vào như một thành phần con

Một đối tượng XAttribute sẽ được sử dụng như một thuộc tính cho thành phần hiện hành

Một gia trị string sẽ được sử dụng như một giá trị cho thành phần hiện hành

Một giá trị null sẽ được bỏ qua

Một đối tượng IEnumerable sẽ được liệt kê và những thành phần của nó sẽ được thêm
vào trong tài liệu XML

Một giá trị của biến, hằng số…được sử dụng như giá trị cho thành phần hiện hành

Một đối tượng XComment sẽ được thêm vào như thành phần con

Một đối tượng XProcessingInstruction sẽ đưa ra một chỉ thị xử lý như một thành phần
con

2.Sử dụng lớp XDeclaration

Bạn có thể sử dụng đối tượng Xdocument để xác định lời khai báo trong XML như trong
ví dụ sau

Ví dụ 13:

XDocument xml = new XDocument (

New XDeclaration(“1.0”,UTF-8”,”yes”),

new XElement (“people”,

new XElement (“idperson”,

new XAttribute (“id”1),

new XAttribute (“year”,2004),

new XAttribute(“salaryyear”,”10000,000”)));
System.IO.StringWriter sw=new System.IO.StringWrite();

xml.Save(sw);

Việc sử dụng lớp XAttribute để thêm các giá trị thuộc tính đến các thành phần hiện
hành.Hơn nữa phương thức Save được cung cấp bởi hai lớp XDocument và XElement để
lưu một tài liệu đã hoàn thành trong một đối tượng StringWriter

Hình 7: Kết quả xuất

3.Sử dụng lớp XNameSpace để tạo một tài lệu XML

Nếu bạn cần sử dụng những khai báo không gian tên cho XML thì sử dụng lớp
XNameSpace.Việc sử dụng nó để tạo một tài liệu XML cũng tương tự như sử dụng nó
để tạo truy vấn đến các thành phần và các thuộc tính.Chúng ta phải sử dụng biến
namespace trong hàm khởi tạo lớp XElement và thêm chuỗi mà đưa ra tên của thành
phần hoặc tên của thuộc tính.

Ví dụ 14:

XNameSpace w = http://schemas.microsoft.com/office/word/2007/wordml;

XDocument word = new XDocument(

New XDeclaration(“1.0”,UTF-8”,”yes”),

New XprocessingInstruction(“mso-application”,

“progid=\”Word.Document\””),

new XElement(w + “wordDocument”,

new XAttribute(XNameSpace.Xmlns + “w”,

w.NamespaceName)));

System.IO.StringWriter sw = new System.IO.StringWriter();

word.Save(sw);

Console.WriteLine(sw);
Đoạn mã trên cho thây cách để thêm một namespace và cách để thêm một element và
attribute có liên quan với namespace.

Hình 8:Kết quả xuất

4.Truyền tải mộ tệp XML

Một đặc điểm hướng đối tượng của phương thức khởi tạo lớp XElement là nó có thể đưa
ra một IEnumerable< XElement> collection như một đối số(argument).Phương thức khởi
tạo sẽ lặp lại tự động qua collection và tạo các element con của element hiên hành.

Những collection loại này thưởng được sản xuất ra bởi truy vấn LINQ vì thê schungs ta
có thể truy vấn một tài liệu XML và xuất ra một tài liệu XML mới với những đặc điểm
khác nhau.Qúa trình xử lý này được gọi là XML Transformation và nó thường làm việc
với ngôn ngữ XSLT của W3C

Tuy nhiên bằng việc sử dung function construction chúng và việc cung cấp một
IEnumerable collection đến XElement constructor chúng ta có thể dễ dàng truyền tải một
tài một tài liệu XML sử dụng LINQ to XML.Ví dụ sau cho thấy một số thông tin trong tài
liệu XML được truyền tải vào trong một bản HTML

Ví dụ 15:

XElement xml= XElement.Load(@”…\...\People.xml”);

XElement html = new XElement(“HTML”,

new XElement(“BODY”,

new XElement(“TABLE”,

new XElement(“TH”,”ID”),

new XElement(“TH”,”Full Name”),

new XElement(“TH”,”Role”),

from p in xml.Descendants (“person”)

join r in xml. Descendants(“role”) on (int) p.Element(“idrole”)

equals (int) r.Element(“id”)

select new XElement (“TR”,


new XElement(“TD”,p.Element(“id”).Value),

new XElement(“TD”, p.Element(“firstname”).Value)

+” “+ p.Element(“lastname”).Value),

new XElement(“TD”,

r. Element(“roledescription”).Value)))));

html.Save(@”C:\people.html”);

Đoạn code trên là truy vấn LINQ to XML để tạo ra bản lưu trữ HTML.Nó nối thông tin
trong person trong tài liệu XML với thông tin role.Sau đó nó chọn ra những giá trị tương
xứng đến các cột HTML được xuất ra trong phần đầu của HTML.Kết quả xuất được lưu
trong một trang HTML sử dụng phương thức Save.

Hình 9.Tài liệu XML people được chuyển tải trong HTML

5.Loading and Saving XML

LINQ to XML cung cấp dễ dàng phương thức để nạp và lưu những tài liệu XML.Phương
thức load dùng để đảm nhận một đối số chuỗi mà xác định đường dẫn nơi mà tệp XML
được định vị.Tương tự phương thức save đảm nhận một đối số chuỗi trong đó xác ddingj
đường dẫn để lưu trữ tài liệu XML.Những phương thức này có những điểm vượt mức
đáng quan tâm mà chúng ta sẽ nhìn thấy ngay sau đây.

You might also like