Phải có một root (gốc) Element duy nhất, gọi là Document Element , nó chứa tất cả các Elements khác trong tài liệu.. Mỗi opening Tag phải có một closing Tag giống như nó.[r]
(1)Tìm hiểu cấu trúc cú pháp của XML
Để thấy ảnh hưởng rộng lớn XML ngành Công Nghệ Thông Tin cận đại bạn cần để ý XML lý hữu (raison d'être) Microsoft Net Từ WindowsXP trở đi, bên đầy dẫy XML Microsoft đầu tư tỷ đô la Mỹ vào kỹ thuật nầy, tương lai gần tất phần mềm Microsoft không dọn nhà (được ported) qua NET NET Enabled (dùng cho NET được) Đi song song với NET SQLServer 2000, sở liệu hổ trợ XML hoàn tồn
Có lẽ bạn nghe qua Web Services Đó dịch vụ Web ta dùng on-demand , tức cần cho chương trình mình, cách gọi theo phương pháp giống giống gọi Hàm (Function) Web Services triển khai dựa vào XML Http, chuẩn dùng để gởi trang Web
Điểm quan trọng kỹ thuật XML khơng thuộc riêng cơng ty nào, tiêu chuẩn người cơng nhận soạn World Wide Web Consortium - W3C (một ban soạn thão với diện tất dân có máu mặt giang hồ Tin học) muốn đóng góp cách trao đổi qua Email Bản thân XML khơng có khó hiểu, cơng cụ chuẩn định để làm việc với XML Document Object Model - DOM, XPath, XSL, v.v hữu hiệu, chuẩn nầy phát triển không ngừng
Microsoft committed (nhất dấn thân) vào XML từ đầu Chẳng có đại diện để làm việc thường trực W3C mà cịn tích cực đóng góp cách gởi đề nghị Vị trí Microsoft XML tiêu chuẩn chưa hồn thành sản phẩm Microsoft tn thủ (comply) có vẽ đa số cơng nhận tiêu chuẩn hồn thành tn thủ hồn tồn
Cái cơng cụ XML sáng giá Microsoft ActiveX MSXML Nó dùng Visual Basic 6, ASP (Active Server Pages) IIS Internet Explorer từ version 5.5 Hiện MSXML cóversion 4.0 MSXML parse (đọc phân tích) validate (kiểm tra hợp lệ) XML file ta DOM, tree Nodes đại diện thành phần bên XML MSXML giúp ta dựa vào XSL file để transform (biến thể) XML file thành trang Web (HTML) hay XML khác
XML gì? Một chút lịch sử
Như tất biết, XML viết tắt cho chữ eXtensible Markup Language - Markup Language (ngôn ngữ đánh dấu) gì?
Trong ngành ấn lốt, để thị cho thợ chữ cách in vỡ, tác giả hay chủ bút thường vẽ vòng tròn thão thích ngơn ngữ đánh dấu tương tự tốc ký Ngôn ngữ gọi Markup Language
XML ngôn ngữ đánh dấu tương đối subset (một phần nhỏ hơn) đến từ (derived from) ngôn ngữ đánh dấu già dặn tên Standard Generalized Markup Language (SGML) Ngôn ngữ HTML dựa vào SGML, thật áp dụng SGML
SGML phát minh Ed Mosher, Ray Lorie Charles F Goldfarb nhóm IBM research vào năm 1969, người đặt chân lên mặt trăng Lúc đầu có tên Generalized Markup Language (GML), thiết kế để dùng làm meta-language, ngôn ngữ dùng để diễn tả ngôn ngữ khác - văn phạm, ngữ vựng chúng ,.v.v Năm1986, SGML quan ISO (International Standard Organisation) thu nhận (adopted) làm tiêu chuẩn để lưu trữ trao đổi liệu Khi Tim Berners-Lee triển khai HyperText Markup Language - HTMLđể dùng cho trang Web hồi đầu thập niên 1990, ông ta nhắc nhở HTML áp dụng SGML
(2)định nghĩa hồ sơ February 1998 W3C Recommendation, giống Internet Request for Comments (RFC), "tiêu chuẩn"
Từ HTML đến XML
Trong trang Web, ngôn ngữ đánh dấu HTML dùng cặp Tagsđể đánh dấu vị trí đầu cuối mảnh liệu để giúp chương trình trình duyệt (browser) parse (ngắt khúc để phân tích) trang Web hiển thị phần theo ý người thiết kế trang Web Thí dụ câu HTML đây:
<P align="center">Chào mừng bạn đến thăm <STRONG>Vovisoft</STRONG>Web site </P>
Câu code HTML có chứa hai markup Tags, <P> <STRONG> Mỗi cặp Tags gói liệu đánh dấu opening Tag closing Tag Hai closing Tags </P> </STRONG> Tất nằm bên cặp Tags gọi Element Để nói thêm đặc tính Element, ta nhét Attribute align opening Tag Element dạng AttributeName="value", thí dụ align="center"
Vì Tags HTML dùng để format (trình bày) tài liệu nên browser cần biết ý nghĩa Tag Một browser hay HTML parser thu thập thị sau từ câu HTML trên:
1 Bắt đầu Paragraph đặt Text trang (<P align="center">) Hiển thị câu Chào mừng bạn đến thăm
3 Hiển thị chữ Vovisoft cách mạnh mẽ (<STRONG>Vovisoft</STRONG>) Hiển thị câu Web site
5 Gặp điểm cuối Paragraph (</P>)
Để xử lý đoạn code HTML trên, browser cần phải xác định vị trí Tags mà cịn phải hiểu ý nghĩa Tag Vì Tag có ý ngĩa riêng nó, thí dụ P cho Paragraph, STRONGđể nhấn mạnh, thí dụ dùng chữđậm (Bold)
Giống HTML, XML đến từ SGML Nó dùng Tags để encode data Điểm khác biệt chánh HTML XML Tags HTML chứa ý nghĩa formatting (cách trình bày) liệu, Tags XML chứa ý nghĩa cấu trúc liệu Thí dụ tài liệu đặt hàng (order) XML đây:
<Order OrderNo="1023">
<OrderDate>2002-3-27</OrderDate>
<Customer>Peter Collingwood</Customer>
<Item>
<ProductID>1</ProductID> <Quantity>5</Quantity> </Item>
<Item>
<ProductID>4</ProductID> <Quantity>3</Quantity> </Item>
</Order>
Tài liệu nầy chứa liệu, không nhắc nhở đến cách trình bày Điều nầy có nghĩa XML parser (chương trình ngắt khúc phân tích) khơng cần phải hiểu ý nghĩa cũa Tags Nó cần tìm Tags xác định tài liệu XML hợp lệ Vì browser không cần phải hiểu ý nghĩa Tags, nên ta dùng Tag Đó lý người ta dùng chữ eXtensible (mở rộng thêm được), dùng chữ để viết tắt lại chọn X thay e, có lẽ X nghe có vẽ kỳ bí, hấp dẫn
Chúng ta quan sát kỹ cấu trúc XML Trước hết, Element Order có Attribute OrderNo với value 1023 Bên Element Order có:
Một Child (con) Element OrderDate với value 2002-3-27 Một Child Element Customer với value Peter Collingwood
(3)Đôi ta để Element với tên đàng hồng, khơng chứa value, lý ta muốn dùng Element Nhiệm ý (Optional), có được, khơng có không Cách tự nhiên gắn closing Tag sau opening Tag Thí dụ Empty (trống rỗng) Element MiddleInitial Element customer đây:
<Customer>
<FirstName>Stephen</FirstName>
<MiddleInitial></MiddleInitial>
<LastName>King</LastName>
</Customer>
Có cách khác để biểu diễn Empty Element bỏ closing Tag thêm dấu "/" (slash) cuối openning Tag Ta viết lại thí dụ customer sau:
<Customer>
<FirstName>Stephen</FirstName>
<MiddleInitial/>
<LastName>King</LastName>
</Customer>
Dĩ nhiên Empty Element có Attribute Element PhoneNumber thứ nhì đây:
<Customer>
<FirstName>Stephen</FirstName>
<MiddleInitial></MiddleInitial>
<LastName>King</LastName>
<PhoneNumber Location="Home">9847 2635</PhoneNumber>
<PhoneNumber Location="Work"></PhoneNumber>
</Customer>
Biểu diễn Data XML
Một tài liệu XML phải well-formed valid Mặc dầu hai từ nầy nghe tờ tợ, chúng có ý nghĩa khác Một XML well-formed XML thích hợp cho parser chế biến Tức XML tuân thủ luật lệ Tag,
Element, Attribute , value v.v chứa bên để parser nhận diện phân biệt thứ
Để ý XML well-formed chưa chứa đựng liệu hữu dụng công việc làm ăn Là well -formed có nghĩa XML có cấu trúc Để hữu dụng cho công việc làm ăn, XML well-formed mà cần phải valid Một tài liệu XML valid chứa data cần có loại tài liệu loại hay class Thí dụ XML đặt hàng bị địi hỏi phải có Attribute OrderNo Child Element Orderdate Parser validate XML cách kiểm tra data XML xem có định nghĩa
Specification loại tài liệu XML Specification nầy Document Type Definition (DTD) hay Schema
Chốc ta nói đến valid, bàn well-formed Tạo tài liệu XML well-formed
Để well-formed, tài liệu XML phải theo luật sau đây:
1 Phải có root (gốc) Element nhất, gọi Document Element, chứa tất Elements khác tài liệu
2 Mỗi opening Tag phải có closing Tag giống
3 Tags XML case sensitive, tức opening Tag closing Tag phải đánh vần y nhau, chữ hoa hay chữ thường
4 Mỗi Child Element phải nằm trọn bên Element cha
5 Attribute value XML phải gói cặp ngoặc kép hay cặp apostrophe
(4)<Product ProductID="1">Chair</Product>
<Product ProductID="2">Desk</Product>
Một tài liệu XML khơng có root Element gọi XML fragment (mảnh) Để làm cho well-formed ta cần phải thêm root Element đây:
<Catalog>
<Product ProductID="1">Chair</Product>
<Product ProductID="2">Desk</Product>
</Catalog>
Luật thứ hai nói opening Tag phải có closing Tag giống Tức Tag mở phải đóng lại Empty Element viết cách gọn <MiddleInitial/>được gọi có Tag tự đóng lại Các Tags khác phải có closing Tag Cái XML khơng well-formed có chứa một Tag <Item> thiếu closing Tag </Item>:
<Order>
<OrderDate>2002-6-14</OrderDate>
<Customer>Helen Mooney</Customer>
<Item>
<ProductID>2</ProductID> <Quantity>1</Quantity> <Item>
<ProductID>4</ProductID> <Quantity>3</Quantity> </Item>
</Order>
Để làm cho well-formed ta phải thêm closing tag cho Element Item thứ nhất: <Order>
<OrderDate>2002-6-14</OrderDate>
<Customer>Helen Mooney</Customer>
<Item>
<ProductID>2</ProductID> <Quantity>1</Quantity> </Item>
<Item>
<ProductID>4</ProductID> <Quantity>3</Quantity> </Item>
</Order>
Luật thứ ba nói tên Tag case sensitive, tức closing Tag phải đánh vần y hệt opening Tag, phân biệt chữ hoa, chữ thường Như <order> khác với <Order>, ta dùng Tag </Order>để đóng Tag
<order> Cái XML khơng well-formed opening Tag closing Tags Element OrderDate không đánh vần giống nhau:
<Order>
<OrderDate>2001-01-01</Orderdate>
<Customer>Graeme Malcolm</Customer>
</Order>
Muốn làm cho well formed, ta phải sửa chữ d thành chữ hoa (uppercase) D sau: <Order>
<OrderDate>2001-01-01</OrderDate>
<Customer>Graeme Malcolm</Customer>
</Order>
Luật thứ tư nói Child Element phải nằm trọn bên Element cha nó, tức khơng thể bắt đầu Element Element nầy chưa chấm dứt Thí dụ tài liệu XML khơng well-formed closing Tag Category trước closing Tag Product
(5)<Category CategoryName="Beverages"> <Product ProductID="1">
Coca-Cola </Category> </Product> </Catalog>
Muốn sửa cho well-formed ta cần phải đóng Tag Product trước đây:
<Catalog>
<Category CategoryName="Beverages">
<Product ProductID="1"> Coca-Cola
</Product> </Category> </Catalog>
Luật cuối tài liệu XML well-formed đòi hỏi value Attribute phải gói cặp apostrophe hay ngoặc kép Tài liệu khơng well-form Attribute values khơng ngoặc đàng hồng, số 1 khơng có dấu ngoặc, số 2 có apostrophe, ngoặc kép:
<Catalog>
<Product ProductID=1>Chair</Product>
<Product ProductID='2">Desk</Product>
</Catalog>
Processing Instructions Comments
Ngoài liệu cần thiết cho công việc làm ăn, tài liệu XML có chứa Processing Instructions (chỉ thị cách chế biến) cho parser Comments (ghi chú) cho người đọc
Processing Instruction nằm cặp Tags <? ?> Thơng thường cho biết version XML Specification mà parser cần làm theo Có cho biết data XML dùng encoding nào, thí dụ uft-8 Cịn Attribute standalone standalone cho parser biết tài liệu XML validated mình, khơng cần đến DTD hay Schema
Mặc dầu tài liệu XML well-formed không cần có Processing Instruction, thơng thường ta để Processing Instruction đàng đầu tài liệu, phần gọi prologue (giáo đầu) Dưới thí dụ có Processing Instruction prologue tài liệu XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <Order>
<OrderDate>2002-6-14</OrderDate>
<Customer>Helen Mooney</Customer>
<Item>
<ProductID>1</ProductID> <Quantity>2</Quantity> </Item>
<Item>
<ProductID>4</ProductID> <Quantity>1</Quantity> </Item>
</Order>
Có loại Processing Instruction khác thông dụng cho biết tên stylesheet XML nầy, thí dụ như:
<?xml-stylesheet type="text/xsl" href="order.xsl"?>
Ở ta cho XML stylesheet parser biết stylesheet thuộc loại text/xslvà chứa file tên order.xsl Bạn cho thêm Comment cách dùng cặp Tags <! > sau:
(6)</ElementType>
<ElementType name="journal" content="eltOnly">
<! declare series as an optional attribute of journal > <attribute type="series" required="no"></attribute>
<element type="title"></element> <element type="date"></element> <element type="callno"></element> </ElementType>
<ElementType name="book" content="eltOnly">
<! declare hardback as an optional attribute of journal with default value of "no" >
<attribute type="hardback" default="no"></attribute>
<attribute type="availableforloan" default="yes"></attribute> <element type="title"></element>
<! allow for multiple authors with maxOccurs > <element type="author" maxOccurs="*"></element> <element type="callno"></element>
<! allow for ONE optional URL >
<element type="online_url" minOccurs="0" maxOccurs="1"></element> </ElementType>
<ElementType name="library" content="eltOnly">
<! the library name comes first > <element type="name"></element>
<! followed by a collection of books, videos and cds > <group order="many">
<element type="book" maxOccurs="*"></element> <element type="journal" maxOccurs="*"></element> <element type="video" maxOccurs="*"></element> <element type="cd" maxOccurs="*"></element> </group>
</ElementType> </Schema>
Việc chạy program bạn click nút Load XML and Display in TreeView Ðợi chút xíu, Tree XML TreeView
Ðồng thời Content XML file loaded vào ListBox lstXMLSource bạn thấy bạn click Tab XML Source Dĩ nhiên bạn display XML file bạn để vào folder program enter Filename vào TextBox txtXMLFileName trứớc click nút Load XML and Display in TreeView
Trong program nầy ta dùng Object IXMLDOMNode, thay Object IXMLDOMElementđể qua nodes XML DOM Program gọi Sub AddNodeđể bỏ Nodes vào TreeView Ðặc biệt AddNode gọi bên Sub AddNode Kỹ thuật nầy gọi recursive, mà ta thường lấy dùng cấu trúc giống nhánh cây, Con lại có nhiều Con khác Listing Sub AddNode sau:
Private Sub AddNode(ByRef oElem As IXMLDOMNode, Optional ByRef oTreeNode As Node)
(7)Dim oNodeList As IXMLDOMNodeList Dim i As Long
' Create the new node
If oTreeNode Is Nothing Then
' Go through here when creating the top level nodes, i.e childNodes of root node Set oNewNode = TreeView.Nodes.Add
Else
Set oNewNode = TreeView.Nodes.Add(oTreeNode, tvwChild) End If
' Expand TreeView node oNewNode.Expanded = True
' Prepare the Text for the TreeView Node If oElem.nodeType = NODE_ELEMENT Then
' Element Node type Use Node name and Attribute values oNewNode.Text = BuildNodeLabel(oElem)
ElseIf (oElem.nodeType = NODE_TEXT) Then
' Last Node in the branch Use Text oNewNode.Text = oElem.Text
ElseIf (oElem.nodeType = NODE_COMMENT) Then
' Comment Node Display the comment oNewNode.Text = "Comment:" & oElem.Text Else
' Display Nodename as default oNewNode.Text = oElem.nodeName End If
' process the childNodes which form a NodeList Set oNodeList = oElem.childNodes
' Iterate through each childNode For i = To oNodeList.length -
' Recursively call AddNode to add more nodes as children of oNewNode, ' treating AddNode just like another Sub
AddNode oNodeList.Item(i), oNewNode Next
End Sub
Có ba loại Nodes ta xử lý đây: NODE_ELEMENT, NODE_TEXT NODE_COMMENT Element Node có Node , Attributes Con Text Node Comment Node có text
Bạn download chương trình mẫu XMLTreeDOM.zip để chạy thử
a Microsoft Net T i World Wide Web Consortium - W3C download chươ