Professional Documents
Culture Documents
Chương 4 XML
Chương 4 XML
Nội dung
2 SE-PRO
Giới thiệu về LINQ
LINQ (Language Integrated Query) – Ngôn ngữ
truy vấn tích hợp - Ngôn ngữ thống nhất cách
thức truy xuất dữ liệu trong .NET.
3 SE-PRO
Giới thiệu về LINQ
• LINQ được phân thành 3 loại:
LINQ to Objects
LINQ to XML
LINQ to SQL
4 SE-PRO
Nội dung
5 SE-PRO
LINQ TO XML(1)
LINQ to XML cung cấp một giao diện lập trình XML.
6 SE-PRO
LINQ TO XML(2)
7 SE-PRO
Truy vấn XML bằng LINQ(1)
IEnumerable<XElement> Descendants( string ElementName)
Trả ra một Collections XElement giúp bạn truy xuất đến
Element có tên ElementName.
IEnumerable<XElement> Ancestor();
Trả ra một Collections các XElement chứa nó (parent).
IEnumerable<XElement> ElementBeforeSelf();
Trả ra một Collections các XElement đứng trước Element
hiện tại.
IEnumerable<XElement> ElementAfterSelf();
Trả ra một Collections các XElement đứng sau Element hiện
tại.
8 SE-PRO
Truy vấn XML bằng LINQ(2)
XElement Parent();
Trả ra một XElement giúp bạn truy xuất đến Element
cha(chứa nó).
bool HasElement();
Kiểm tra xem Element hiện tại có Element con nào
không.
bool HasAttribute();
Kiểm tra xem Element hiện tại có Attribute nào không.
void Save( string URL);
Lưu một tài liệu XML xuống file URL
bool IsEmpty();
Kiểm tra xem Element hiện tại có rỗng không.
9 SE-PRO
Truy vấn XML bằng LINQ(4)
Ba phần cơ bản của một truy vấn XML
1. Có được các dữ liệu nguồn. Lấy nội dung tag Rows của
2. Tạo các truy vấn. Element có levelIndex == 2
3. Thực hiện các truy vấn.
using System.Xml.Linq; GameData.xml
... <? xml version="1.0" encoding="utf-8"?>
XDocument XDoc = new <!--Thông tin Level -->
XDocument.Load(“GameData.xml”); <Levels>
<Level levelIndex="1">
var query = from q in <ImagePath>Girl.jpg</ImagePath>
XDoc.Descendants(“Levels”).Elements(“Level”) <Rows>3</Rows>
where (int)q.XAttribute(“levelIndex”) == 2 <Cols>3</Cols>
select q; </Level>
<Level levelIndex=“2">
foreach( var p in query) <ImagePath>Boy.jpg</ImagePath>
{ <Rows>4</Rows>
System.Console.WriteLine(“Rows: {0}”, <Cols>4</Cols>
p.Element(“Rows”).Value); </Level>
} </Levels>
10 SE-PRO
Nội dung
11 SE-PRO
Tạo và Biến đổi một tài liệu XML
Tạo một tài liệu XML:
Ta sử dụng hàm khởi tạo XDocument();
XDocument(XDeclaration xd, param object[] content);
Trong đó:
XDeclaration(string version, string encoding, string standalone)
version là phiên bản của tài liệu “1.0”.
encoding là bảng mã lữu trữ “UTF-8”.
standalone tồn tại một mình hay không “Yes” hoặc “No”.
Thường thì không có thuộc tính này cũng không sao cả.
object[] là danh sách các đối tượng cần đưa vào tài liệu:
XComment(string comment )
Chứa chú thích cho tài liệu comment = “Chú thích đây” sẽ
cho kết quả <!-- Chú thích đây --!>
XElement( XName name, param object[] content)
• XName là tên của Element <name> </name>
•object[] tương tự object[] nói ở trên.
Dùng hàm Save( string URL ) để lưu xuống file URL
12 SE-PRO
Tạo và Biến đổi một tài liệu XML
XDoc. Save(“GameData.xml”);
13 SE-PRO
Tạo và Biến đổi một tài liệu XML
Hoặc táo bạo hơn một chút với phương thức Parse()
Code: GameData.xml
using System.Xml.Linq; <? xml version="1.0" encoding="utf-8"?>
... <!--Thông tin Level -->
<Levels>
XDocument XDoc = new XDocument(
<Level levelIndex="1">
new XDeclaration("1.0", "utf-8", "yes"),
<ImagePath>Girl.jpg</ImagePath>
new XComment("Thông tin Level "),
<Rows>3</Rows>
new XElement.Parse(
<Cols>3</Cols>
“<Levels>
</Level>
<Level levelIndex="1">
</Levels>
<ImagePath>Girl.jpg</ImagePath>
<Rows>3</Rows>
<Cols>3</Cols>
</Level>
</Levels>”
)
);
XDoc. Save(“GameData.xml”);
14 SE-PRO
Thêm một Element(1)
15 SE-PRO
Thêm một Element(2)
• void Add( XElement content);
Add • Thêm content như là một Node con vào cuối Element hiện tại.
XDoc.Add(.......); Error ! Vị trí cần chèn vào không phải là một XElement
16 SE-PRO
Thêm một Element(3)
• void AddFist( XElement content);
AddFist
• Thêm content như là một Node con vào đầu Element hiện tại.
XDoc.Add(.......); Error ! Vị trí cần chèn vào không phải là một XElement.
17 SE-PRO
Thêm một Element(4)
• void AddAfterSelf( XElement content);
AddAfterSelf • Chèn một element vào sau element hiện tại
Kết luận:
Trong hai 4 ví dụ trên thì hai hàm Add() và AddAfterSelf() cho cùng một kết
quả chỉ khác nhau ở vị trí Add vào:
o XDoc.Element ("Levels“).Add()
o XDoc.Descendants(“Levels”).Elements ("Level“).Last().AddAfterSelf()
20 SE-PRO
Cập nhật một Element(1)
• SetValue(object value);
SetValue • Đặt giá trị cho element hiện tại giá trị là value vì là kiểu object
nên nó cũng có thể là cả một XElement.
21 SE-PRO
Cập nhật một Element(2)
Muốn cập nhật phải tìm được XElement trong tài liệu trước.
22 SE-PRO
Cập nhật một Element(3)
• SetValue(object value);
SetValue • Đặt giá trị cho element hiện tại giá trị là value vì là kiểu object
nên nó cũng có thể là cả một XElement.
23 SE-PRO
Cập nhật một Element(3)
• SetAttributeValue(XName name, object value);
SetAttributeValue
• Đặt giá trị value cho “attribute” của element tên name.
Muốn cập nhật phải tìm được XElement trong tài liệu trước.
24 SE-PRO
Cập nhật một Element(4)
• SetElementValue(XName name, object value);
SetElementValue • Đặt giá trị cho “element” tên name giá trị là value vì là kiểu
object nên nó cũng có thể là một XElement.
• Remove();
Remove • Xóa node hiện tại từ element parent
của nó.
• RemoveAll();
RemoveAll • Xóa tất cả các Attribute và Node con
của tài liệu XML hoặc element hiện tại.
• RemoveAttributes();
RemoveAttributes
• Xóa “attribute” của element hiện tại .
• RmoveNode();
RemoveNodes • Xóa node con của element hoặc của
cả tài liệu XML.
26 SE-PRO
Xóa Element(2)
• Remove();
Remove
• Xóa node hiện tại từ element parent của nó.
Sau khi xác định được Level có Attirbute levelIndex == “1” rồi tìm đến Tag
<Cols> ta xóa nó.
27 SE-PRO
Xóa Element(3)
• RemoveAll();
RemoveAll • Xóa tất cả các Attribute và Node con của tài liệu XML hoặc element
hiện tại.
29 SE-PRO
Xóa Element(5)
• RmoveNode();
RemoveNodes • Xóa node con của một XElement hoặc của tài liệu
XML(XDocument).
30 SE-PRO
Nội dung
31 SE-PRO
Truy vấn cơ bản trong XML
• Tìm một phần tử
Tìm phần tử Address có thuộc tính Type có giá trị là "Billing".
trong cây XML
32 SE-PRO
Truy vấn cơ bản trong XML
• Lọc phần tử trong Ví dụ sau lọc những phần tử có phần tử con <Type > có
cây XML Value="Yes".
Code: results
XElement root = XElement.Parse(@"<Root>
Child One Text
<Child1>
<Text>Child One Text</Text> Child Two Text
<Type Value=""Yes""/> Child Four Text
</Child1>
<Child2>
<Text>Child Two Text</Text>
<Type Value=""Yes""/>
</Child2>
<Child3>
<Text>Child Three Text</Text>
<Type Value=""No""/>
</Child3>
<Child4>
<Text>Child Four Text</Text>
<Type Value=""Yes""/>
</Child4>
<Child5>
<Text>Child Five Text</Text>
</Child5>
</Root>");
var cList =
from typeElement in root.Elements().Elements("Type")
where (string)typeElement.Attribute("Value") == "Yes"
select (string)typeElement.Parent.Element("Text");
foreach(string str in cList)
Console.WriteLine(str);
33 SE-PRO
Truy vấn cơ bản trong XML
• Sắp xếp các phần
Sắp theo giá
tử trong cây XML
Code: results
XElement root = XElement.Load("Data.xml"); 0.99
4.95
IEnumerable<decimal> prices = 6.99
from el in root.Elements("Data") 24.50
29.00
let price = (decimal)el.Element("Price") 66.00
orderby price 89.99
select price;
foreach (decimal el in prices)
Console.WriteLine(el);
34 SE-PRO
WINP1.C24