Upload
bui-nam
View
73
Download
0
Embed Size (px)
Citation preview
1
Đọc và tạo tài liệu XML
TS. Trần Minh Triết
Ngô Bá Nam Phương
Nội dung trình bày
Mô hình Stream
Mô hình DOM
LinQ to XML
2
3
Mô hình Stream
Phù hợp với các tài liệu lớn có cấu trúc tương đối đơn giản,
thích hợp cho việc xử lý tuần tự.
Sử dụng 2 lớp trừu tượng XmlReader và XmlWriter để đọc/ghi
từng phần của tài liệu XML.
XmlReader cung cấp các API để đọc tài liệu XML
XmlWriter cung cấp các API để tạo ra các tài XML theo
chuẩn của W3C
4
Sử dụng XmlReader và XmlWriter
Do XmlReader và XmlWriter đều là abstract class, khi sử dụng
cần phải dùng các lớp cụ thể kế thừa từ các lớp này
Sử dụng các lớp XmlTextReader, XmlNodeReader hay
XslReader kế thừa từ XmlReader
Sử dụng XmlTextWriter hay XmlNodeWriter kế thừa từ XmlWriter
XmlReader
XmlTextReader XmlNodeReader
XmlWriter
XmlTextWriter XmlNodeWriter
5
XmlReader
XmlReader hỗ trợ đọc nội dung tài liệu theo dạng chỉ đọc (
read-only ) , không quay lui (forward-only) bằng cách sử dụng
một cursor để xác định node hiện tại đang được xử lý trong
stream tài liệu
Trong quá trình duyệt tài liệu, cursor này sẽ được di chuyển
qua tất cả các node trong tài liệu ( duyệt theo chiều sâu )
Ví dụ: các mở tài liệu XML
XmlTextReader xmlTextReader1 = new XmlTextReader("example1.xml");
XmlTextReader xmlTextReader2 =
new XmlTextReader("http://www.newspaper.com/rss.xml");
6
Đọc các node
Phương thức Read( ) là phương thức cơ sở của XmlReader để
đọc và di chuyển cursor trong tài liệu XML
Mỗi lần gọi hàm Read( ), dữ liệu của node hiện thời mà cursor
đang trỏ đến sẽ được lưu trữ vào trong đối tượng XmlReader.
Sau đó, XmlReader sẽ di chuyển cursor sang node tiếp theo
trong tài liệu cho đến khi hết stream.
Khi hết stream, Read( ) sẽ trả về giá trị False.
7
XmlReader
Ví dụ: đọc và duyệt qua từng node của tài liệu XML và xuất tên của các element trong tài liệu
public void DisplayElements( XmlReader reader ) { /* read the next node in document order */ while ( reader.Read() ) { /* if this is an element node, display its name */ Console.WriteLine( reader.Name ); } }
8
Ví dụ
<persons> <person> <firstname>Albert</firstname> <lastname>Einstein</lastname> </person> <person> <firstname>Niels</firstname> <lastname>Bohr</lastname> </person> </persons>
persons person firstname firstname lastname lastname person person firstname firstame lastname lastname person persons
while ( reader.Read() ) { /* if this is an element node, display its name */ Console.WriteLine( reader.Name ); }
9
Thông tin của node
Với mỗi node đang đọc, XmlReader cung cấp một số hàm và thuộc tính để truy xuất đến giá trị và thuộc tính của node
Ví dụ: các thuộc tính liên quan đến node
Thuộc tính NodeType trả về kiểu node (tương tự DOM)
Thuộc tính Name trả về tên node
Thuộc tính Value trả về giá trị của node
XmlReader cung cấp các hàm đọc nội dung bên trong Element và trả về giá trị theo từng kiểu dữ liệu cụ thể. (ReadElementContentAsInt, ReadElementContentAsString, ReadElementContentAs… , …)
10
Thông tin của node
NodeType Name Value
Element DanhSachSach “”
Element Sach “”
Element MaSach “”
Text “” \r\n 1 \r\n
EndElement MaSach “”
Element TenSach “”
Text “” .net components
EndElement TenSach “”
Element HinhAnh “”
Text “” 0596100639.jpg
EndElement HinhAnh “”
Element GiaTien “”
Text “” 10000
EndElement GiaTien “”
EndElement Sach “”
EndElement DanhSachSach “”
11
Ví dụ: đọc và truy xuất thông tin các
node trong tài liệu
12
Ví dụ: đọc và truy xuất thông tin các
node trong tài liệu
13
Đọc các node
Phương thức ReadToFollowing thực hiện di chuyển cursor đến
một element bất kỳ dựa vào tên của element
Ví dụ: xử lý element Sach trong tài liệu
14
Đọc các Attribute
Attribute là thành phần bên trong của element nên hàm Read( ) KHÔNG duyệt vào các node attribute!!!
Để truy cập các attribute của element hiện tại, sử dụng hàm GetAttribute( ).
Trong GetAttribute( ), có thể truy cập các attribute theo tên của attribute hay chỉ số
Ví dụ: for ( int = 0; i < node.AttributeCount; i++ ) { Console.WriteLine( node.GetAttribute( i ) ); }
15
Đọc các Attribute
XmlReader cung cấp các hàm để duyệt qua các attribute của node hiện tại.
MoveToAttribute( )
MoveToFirstAttribute( )
MoveToNextAttribute( )
Ví dụ: node.MoveToAttribute(“att1”);
Console.Write( " " + node.Name + "=\""+node.Value+"\"" );
while ( node.MoveToNextAttribute() ) { Console.Write( " " + node.Name + "=\""+node.Value+"\"" ); }
16
XmlWriter
XmlWriter là abstract class cho phép tạo ra tài liệu theo định
dạng XML của W3C theo mô hình Stream.
XmlWriter hỗ trợ việc tạo tài liệu XML tự động, ví dụ như
đảm bảo việc đóng các tag của element đầy đủ, các giá trị của
attribute được ghi nháy kép đầy đủ…
17
XmlWriter
Sử dụng hàm Create để tạo tài liệu xml mới
18
XmlWriter
Sử dụng hàm WriteStartElement để tạo ra element mới ( thẻ
mở ) và hàm WriteEndElement tạo ra thẻ đóng tương ứng.
19
XmlWriter
WriteString tạo ra phần nội dung text node bên trong một
element
WriteElementString tạo ra thẻ element mới ( thẻ mở ) + nội
dung ( text node ) + thẻ đóng tương ứng.
20
XmlWriter
Format nội dung thể hiện của tài liệu xml sử dụng đối tượng XmlWriterSettings
Nội dung trình bày
Mô hình Stream
Mô hình DOM
LinQ to XML
21
XML DOM
Biểu diễn nội dung tài liệu XML trong bộ nhớ chính theo cấu
trúc cây phân cấp
Phù hợp cho việc xử lý trên các tài liệu với nội dung nhỏ.
Cho phép cập nhật nội dung tài liệu XML, truy xuất ngẫu
nhiên đến các node bất kỳ trên tài liệu ( random access).
22
XML DOM
Ví dụ:
<font>
<name>Helvetica</name>
<size>36</size>
</font>
Node font có 5 node con:
whitespace
name
whitespace
size
whitespace
23
W3C XML DOM Node Types
24
Hiện thực hóa W3C DOM trong .NET
25
Các thao tác chính ( XML DOM )
Mở/Lưu tài liệu
Duyệt tài liệu XML
Thêm node mới
Xóa node
Tìm kiếm node
26
Mở/Lưu tài liệu XML
Load( string fileName): đọc từ file
Save ( string fileName): lưu các thay đổi trên nội dung tài liệu
LoadXml( string xmlContent ): đọc từ chuỗi
27
Duyệt tài liệu XML
28
Duyệt các nodes :
- ParentNode
- ChildNodes
- FirstChild
- LastChild
- NextSibling
- PreviousSibling
Duyệt tài liệu XML ( ví dụ )
29
Thêm Node mới
30
Xóa Node
Phương thức RemoveChild
31
Tìm kiếm Node
GetElementsByTagName( string nodeName )
32
Tìm kiếm Node ( tt )
Tìm kiếm node sử dụng biểu thức XPath:
SelectNodes ( string xPath ) : XmlNodeList
SelectSingleNode (string xPath ) : XmlNode
33
Nội dung trình bày
Mô hình Stream
Mô hình DOM
LinQ to XML
34
LINQ to XML
Mở/Lưu tài liệu
Tạo Element/Attribute
Duyệt tài liệu XML
Cập nhật nội dung tài liệu
35
Mở/Lưu tài liệu XML
Mở tài liệu ( XDocument, XElement ):
XDocument.Load( string fileName) : static
XElement.Load ( string fileName) : static
Lưu tài liệu
Save (string fileName )
36
Tạo Element
Sử dụng XElement constructor
37
Tạo Attribute
Sử dụng XAttribute constructor
38
Tạo tài liệu ( ví dụ 1 )
39
Tạo tài liệu ( ví dụ 1 – tt )
40
Tạo tài liệu ( ví dụ 2 )
41
Ví dụ 2 – kết quả
42
Duyệt tài liệu XML ( ví dụ tham khảo )
43
Lấy danh sách node con theo tên node
Element(string nodeName)
Elements(string nodeName)
Ví dụ:
Lấy node gốc Planets:
XDocument doc = XDocument.Load("example6.xml");
doc.Element("Planets");
Lấy danh sách node con Planet:
XDocument doc = XDocument.Load("example6.xml");
foreach (var q in doc.Element("Planets").Elements("Planet"))
{
Console.WriteLine(q);
}
44
Truy cập nội dung bên trong Element, thuộc tính của Element.
45
Lấy danh sách node con, cháu (ở độ sâu bất kỳ):
Descendants( ) : IEnumerable<XElement>
Descendants( string nodeName) : IEnumerable<XElement>
Ví dụ: lấy danh sách tất cả node Moon:
46
Truy cập đến node cha, các node ở cấp cao hơn:
Parent
Ancestors( ) , Ancestors( string nodeName )
47
Cập nhật nội dung tài liệu
Xóa node: Remove( )
48
Cập nhật nội dung tài liệu ( tt )
Cập nhật node:
Ví dụ:
49
Cập nhật nội dung tài liệu ( tt )
Thêm attribute vào node
50
Cập nhật nội dung tài liệu ( tt )
SetElementValue ( string elementName , string value )
SetAttributeValue ( string attributeName , string value )
Cập nhật ( nếu đã tồn tại )
Xóa ( nếu value là Null )
Thêm mới ( nếu chưa tồn tại )
51
Cám ơn
Giải đáp thắc mắc ???
52