52
1 Đọc và tạo tài liệu XML TS. Trần Minh Triết Ngô Bá Nam Phương

XML Xlinq - Nbnphuong

  • Upload
    bui-nam

  • View
    73

  • Download
    0

Embed Size (px)

Citation preview

Page 1: XML Xlinq - Nbnphuong

1

Đọc và tạo tài liệu XML

TS. Trần Minh Triết

Ngô Bá Nam Phương

Page 2: XML Xlinq - Nbnphuong

Nội dung trình bày

Mô hình Stream

Mô hình DOM

LinQ to XML

2

Page 3: XML Xlinq - Nbnphuong

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

Page 4: XML Xlinq - Nbnphuong

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

Page 5: XML Xlinq - Nbnphuong

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");

Page 6: XML Xlinq - Nbnphuong

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.

Page 7: XML Xlinq - Nbnphuong

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 ); } }

Page 8: XML Xlinq - Nbnphuong

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 ); }

Page 9: XML Xlinq - Nbnphuong

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… , …)

Page 10: XML Xlinq - Nbnphuong

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 “”

Page 11: XML Xlinq - Nbnphuong

11

Ví dụ: đọc và truy xuất thông tin các

node trong tài liệu

Page 12: XML Xlinq - Nbnphuong

12

Ví dụ: đọc và truy xuất thông tin các

node trong tài liệu

Page 13: XML Xlinq - Nbnphuong

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

Page 14: XML Xlinq - Nbnphuong

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 ) ); }

Page 15: XML Xlinq - Nbnphuong

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+"\"" ); }

Page 16: XML Xlinq - Nbnphuong

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 đủ…

Page 17: XML Xlinq - Nbnphuong

17

XmlWriter

Sử dụng hàm Create để tạo tài liệu xml mới

Page 18: XML Xlinq - Nbnphuong

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.

Page 19: XML Xlinq - Nbnphuong

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.

Page 20: XML Xlinq - Nbnphuong

20

XmlWriter

Format nội dung thể hiện của tài liệu xml sử dụng đối tượng XmlWriterSettings

Page 21: XML Xlinq - Nbnphuong

Nội dung trình bày

Mô hình Stream

Mô hình DOM

LinQ to XML

21

Page 22: XML Xlinq - Nbnphuong

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

Page 23: XML Xlinq - Nbnphuong

XML DOM

Ví dụ:

<font>

<name>Helvetica</name>

<size>36</size>

</font>

Node font có 5 node con:

whitespace

name

whitespace

size

whitespace

23

Page 24: XML Xlinq - Nbnphuong

W3C XML DOM Node Types

24

Page 25: XML Xlinq - Nbnphuong

Hiện thực hóa W3C DOM trong .NET

25

Page 26: XML Xlinq - Nbnphuong

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

Page 27: XML Xlinq - Nbnphuong

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

Page 28: XML Xlinq - Nbnphuong

Duyệt tài liệu XML

28

Duyệt các nodes :

- ParentNode

- ChildNodes

- FirstChild

- LastChild

- NextSibling

- PreviousSibling

Page 29: XML Xlinq - Nbnphuong

Duyệt tài liệu XML ( ví dụ )

29

Page 30: XML Xlinq - Nbnphuong

Thêm Node mới

30

Page 31: XML Xlinq - Nbnphuong

Xóa Node

Phương thức RemoveChild

31

Page 32: XML Xlinq - Nbnphuong

Tìm kiếm Node

GetElementsByTagName( string nodeName )

32

Page 33: XML Xlinq - Nbnphuong

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

Page 34: XML Xlinq - Nbnphuong

Nội dung trình bày

Mô hình Stream

Mô hình DOM

LinQ to XML

34

Page 35: XML Xlinq - Nbnphuong

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

Page 36: XML Xlinq - Nbnphuong

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

Page 37: XML Xlinq - Nbnphuong

Tạo Element

Sử dụng XElement constructor

37

Page 38: XML Xlinq - Nbnphuong

Tạo Attribute

Sử dụng XAttribute constructor

38

Page 39: XML Xlinq - Nbnphuong

Tạo tài liệu ( ví dụ 1 )

39

Page 40: XML Xlinq - Nbnphuong

Tạo tài liệu ( ví dụ 1 – tt )

40

Page 41: XML Xlinq - Nbnphuong

Tạo tài liệu ( ví dụ 2 )

41

Page 42: XML Xlinq - Nbnphuong

Ví dụ 2 – kết quả

42

Page 43: XML Xlinq - Nbnphuong

Duyệt tài liệu XML ( ví dụ tham khảo )

43

Page 44: XML Xlinq - Nbnphuong

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

Page 45: XML Xlinq - Nbnphuong

Truy cập nội dung bên trong Element, thuộc tính của Element.

45

Page 46: XML Xlinq - Nbnphuong

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

Page 47: XML Xlinq - Nbnphuong

Truy cập đến node cha, các node ở cấp cao hơn:

Parent

Ancestors( ) , Ancestors( string nodeName )

47

Page 48: XML Xlinq - Nbnphuong

Cập nhật nội dung tài liệu

Xóa node: Remove( )

48

Page 49: XML Xlinq - Nbnphuong

Cập nhật nội dung tài liệu ( tt )

Cập nhật node:

Ví dụ:

49

Page 50: XML Xlinq - Nbnphuong

Cập nhật nội dung tài liệu ( tt )

Thêm attribute vào node

50

Page 51: XML Xlinq - Nbnphuong

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

Page 52: XML Xlinq - Nbnphuong

Cám ơn

Giải đáp thắc mắc ???

52