Các ứng dụng của một XML Parser

pdf 24 trang ngocly 1750
Bạn đang xem 20 trang mẫu của tài liệu "Các ứng dụng của một XML Parser", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfcac_ung_dung_cua_mot_xml_parser.pdf

Nội dung text: Các ứng dụng của một XML Parser

  1. Cá c ứ ng duṇ g củ a môṭ XML Parser XML càng lúc càng trở nên thiṇ h hành. Dâù muốn hay không, nếu là software engineer, trước sau gi ̀ baṇ cũng phải lâp̣ triǹ h với XML. Nếu lâp̣ triǹ h băǹ g VB6 baṇ có thể dùng Document Object Model (DOM) hay Simple API for XML (SAX) của Microsoft để giúp đở baṇ trong công tác parsing (phân tích, sắp đăṭ) các XML files. DOM đoc̣ nguyên môṭ XML file rồi parse nó thành môṭ Tree có đẳng cấp trong bộ nhớ, tứ c là môṭ node cha của Document có những nodes con đaị diêṇ cho comments,
  2. tags, directives và text (goị là XML entities). Trong khi đó SAX đoc̣ môṭ XML file và trong khi parse sẽ generate những Events cho hay khi nào nó găp̣ phải những XML entities. SAX không taọ ra môṭ Tree nào cả, nên các ứ ng duṇ g tùy thuôc̣ vào cách ta handle các Events từ SAX. Di ̃ nhiên là SAX nhỏ và đơn giản hơn DOM nhiều. Để không phải tùy thuôc̣ hoàn toàn vào XML parser của người khác và để giúp baṇ có ý niêṃ thưc̣ tế về cách làm viêc̣ của môṭ XML Parser, trong bài nâỳ ta sẽ triển khai môṭ XML Parser đơn giản (Simple XML Parser - SXMLParser) hoàn toàn băǹ g VB6 và áp duṇ g nó môṭ cách thưc̣ tiển để làm mâũ . SXMLParser tuy
  3. nhỏ nhưng có những đăc̣ tính tương tơ ̣ như SAX và di ̃ nhiên baṇ có thể tha hồ sử a đổi, thêm những features tùy ý. Các áp duṇ g trước mắt là làm đep̣ (Pretty) XML code, thêm màu cho XML content khi hiển thi ̣ trong môṭ WebBrowser như trong hiǹ h dưới đây:
  4. và taọ môṭ Treeview tươṇ g trưng cho DOM:
  5. Có đươc̣ source code của XML parser của miǹ h baṇ sẽ chiếm ưu thế so với người khác khi thiết kế hay deploy program trên maṇ g. Trước khi bàn về program nâỳ ta haỹ ôn laị các qui luâṭ căn bản về môṭ Well- Formed XML. Well-Formed XML Măc̣ dù baṇ có thể đăṭ ra bao nhiêu Tag cũng đươc̣ , nhưng mỗi trang XML câǹ phải theo môṭ số qui luâṭ để đươc̣ xem là Well-Formed (có đâù , có đuôi). Nếu môṭ trang XML không Well-Formed thi ̀ coi như xài không đuơc̣ , không có chương triǹ h xử lý nào sẽ chiụ làm viêc̣
  6. với dữ liêụ bên trong của nó. Do đó môṭ trang XML câǹ phải theo đúng các qui luâṭ sau đây: 1. Trang XML phải bắt đâù băǹ g câu tuyên bố XML (XML declaration). Điểm nâỳ ta có thể bỏ qua đuơc̣ . 2. Mỗi bô ̣ phâṇ , goị là "element" phải năm̀ giữa môṭ Tag Pair. 3. Nếu Tag nào không chứ a gi ̀ ở giữa thì phải chấm dứ t băǹ g "/>", thí du ̣ như hay . 4. Môṭ trang XML phải có môṭ element đôc̣ nhất chứ a tất cả các elements khác. Đó là root của tree biểu diễn trang XML. 5. Các Tag Pair không đươc̣ xen kẻ nhau (thí du ̣ như John Stanmore 25 King
  7. Street là bất hơp̣ lê ̣ vi ̀ năm̀ trong Tag Pair name). và thêm môṭ vài qui luâṭ về cách dùng các mâũ tư ̣ đăc̣ biêṭ. Ngoài ra các Tag Pair phải đánh vâǹ đúng y như nhau kể cả chữ hoa, chữ thường, (thí du:̣ và là bất hơp̣ lê)̣ và tất cả giá tri ̣ các Attributes đều phải năm̀ giữa hai ngoăc̣ kép (thí du:̣ standalone=yes là bất hơp̣ lê,̣ phải dùng standalone="yes" mới đươc̣ .) Thiết kế SXMLParser Có môṭ VB6 class chính để lo hâù như hoàn toàn viêc̣ parsing môṭ XML file. Sau
  8. khi instantiated môṭ Object thuôc̣ Class clsXMLParser, ta chỉ câǹ cho nó tên của XML file là nó bắt đâù công tác parsing ngay. Như trong hiǹ h màu của XML phía trên ta thấy phâǹ chính của XML là từ hàng thứ tư trở đi khi bắt đâù với Open Tag . Tương ứ ng với mỗi Open Tag là có môṭ Close Tag, thí du ̣ như . Bên trong mỗi căp̣ Tags có thể có những căp̣ Tags (con) khác. Môṭ Open Tag có thể chứ a nhiều căp̣ Attributes dưới daṇ g Name="Value". Lưu ý là Value phải năm̀ giữa hai dấu ngoăc̣ . SXMLParser sẽ đi qua từng character môṭ
  9. của XML file. Khi đoc̣ xong môṭ Open Tag, thí du ̣như: SXMLParser sẽ Raise môṭ StartElement Event để đươc̣ handled trong Form chánh bởi Sub XMLParser_StartElement. Event nâỳ cho Form chánh tên của Tag và môṭ collection của các căp̣ Name="Value" Attributes, thí du ̣ như Tag book đâù tiên c h ứ a hardback="yes" series="Professional C++", chẳng haṇ . Trong Sub XMLParser_StartElement ta làm cùng môṭ lúc ba chuyêṇ : 1. Làm đep̣ XML code, tứ c là các hàng thuṭ ra, thuc̣ vào tùy theo thứ bâc̣ cho
  10. dễ đoc̣ . 2. Thêm màu cho HTML file để hiển thi ̣ XML code trong WebBrowser 3. Taọ các Nodes trong TreeView Private Sub XMLParser_StartElement(ByVal Name As String, ByVal tagAttributes As clsAttributes) ' A complete Start Element has been processed Dim TStr ' Build a string of Atributes' Name="Value" pairs TStr = BuildAttributeString(tagAttributes) ' Display Name Tag in Pretty XML Listbox lstXML.AddItem Space(XMLParser.NestedLevel * TabWidth) & " " ' Add blue color to the equal sign TStr = Replace(TStr, "=", "=") ' prepare colour HTML Name tag lstHTML.AddItem Space(XMLParser.NestedLevel * TabWidth) & " " _ & " " & Name & "" & " " & TStr & " " & " > " ' add a node to the Treeview and save its index in the
  11. stack of nested nodes If XMLParser.NestedLevel = 0 Then ' create the root node With XMLTree.Nodes.Add(, , , Name) nodeStack(0) = .Index ' save the node index in stack .Expanded = True ' Expand node End With Else ' create a child node of the higher nested level mode With XMLTree.Nodes.Add(nodeStack(XMLParser.NestedLevel - 1), tvwChild, , Name) nodeStack(XMLParser.NestedLevel) = .Index ' save the node index in stack .Expanded = True ' Expand node End With End If End Sub Để tái taọ hàng Name="Value" cho collection của các Attributes của môṭ Tag ta dùng Function BuildAttributeString như sau:
  12. Function BuildAttributeString(ByVal tagAttributes As clsAttributes) As String ' Build a string of Atributes' Name="Value" pairs for Element or Instruction Dim i, TStr Dim attr As clsAttributeItem ' Iterate through each Attribute in the collection For i = 1 To tagAttributes.Count ' refer to i-th attribute Set attr = tagAttributes.Item(i) ' Start with a space, create string Name="Value" TStr = TStr & " " & attr.Name & "=""" & attr.Value & """" Next BuildAttributeString = TStr ' Return the resultant string End Function Dưới đây là danh sách các Events raised bởi SXMLParser để Form chánh xử lý: ' Start of parsing Event StartDocument() ' End of parsing
  13. Event EndDocument() ' An XML Instruction has been parsed Event ProcessingInstruction(ByVal Name As String, ByVal tagAttributes As clsAttributes) ' An XML comment has been parsed Event Comment(ByVal Text As String) ' An open tag as been parsed Event StartElement(ByVal Name As String, ByVal tagAttributes As clsAttributes) ' A close tag as been parsed Event EndElement(ByVal Name As String) ' A block of text has been parsed Event Characters(ByVal Text As String) ' Error encountered while parsing Event ParseError(ByVal ErrorNo As Integer, ByVal Description As String) Trong khi parsing SXMLParser thay đổi State hay Mode tùy theo traṇ g thái nó đang tim̀ kiếm thứ gi,̀ chẳng haṇ như character , Attribute Name, Attribute Value, Close Tag .v.v Nếu nó khám phá là XML không Well-Formed thi ̀ nó sẽ
  14. Raise môṭ ParseError Event với lý do và chi tiết liên hê ̣ về Error ấy để hiển thi ̣ trong Form chánh, giúp User biết câǹ sử a đổi ở đâu trong XML file. Danh sách các loaị Error mà SXMLParser support đuơc̣ liêṭ kê dưới đây. Xin lưu ý là có khi Error Message không rõ ràng như ta tưởng tươṇ g vi ̀ parser không thông minh như chúng ta. Const cParseEmptyXML = 1 Const cParseNoCommentCloseTag = 2 Const cParseNoValueCloseQuote = 3 Const cParseNoAttributeName = 4 Const cParseNoEqualSign = 5 Const cParseNoAttributeValue = 6 Const cParseNoCDataCloseTag = 7 Const cParseUnknownSymbols = 8 Const cParseNoOpenQuote = 9 Const cParseBadOpenTag = 10
  15. Const cParseBadCloseTag = 11 Const cParseMismatchTagName = 12 Const cParseNoInstructionCloseTag = 13 Vi ̀ các Tag Pairs câǹ phải có Tag Names giống nhau hoàn toàn (chữ hoa, chữ thường) và không xen kẻ nhau đuơc̣ , nên ta câǹ có môṭ Stack để chứ a các Tag Names theo đúng đẳng cấp trên dưới. Môṭ Stack là môṭ danh sách theo thứ tư ̣ Last-In, First- Out, tứ c là cái gi ̀ mới vào nhất sẽ ra đâù tiên. Ta thưc̣ hiêṇ Stack nâỳ băǹ g Class clsStack. clsStack chứ a các Items thành môṭ String, mà các Items đuơc̣ ngăn cách nhau bởi môṭ vbNullChar (character có ASC value băǹ g 0). Item mới nhất (Last- In) năm̀ đâù bên trái của String. Có ba Functions chánh của Class clsStack
  16. là Push (để nhét môṭ TagName vào), Pop (để lấy TagName mới nhất ra) và LastIn (để chỉ xem TagName mới nhất, chớ không lấy ra). Public Sub Push(InItem As String) ' Push a Item up the Stack. ' Remove any vbNullChars in the Item ' Use vbNullChar as the Delimiter ' ' Prefix the Item to the Stack string mStacks = Replace(InItem, vbNullChar, "") & vbNullChar & mStacks mCount = mCount + 1 ' Increment the Item count End Sub Public Function Pop() As String ' Remove and return the LastIn Item in the Stack. Dim Pos If mCount > 0 Then Pos = InStr(mStacks, vbNullChar) ' Locate vbNullChar If Pos > 0 Then
  17. Pop = Left(mStacks, Pos - 1) ' Extract the LastIn Item mStacks = Mid(mStacks, Pos + 1) ' Keep the remain of the Stack string mCount = mCount - 1 ' decrement the Item Count End If End If End Function Public Function LastIn() As String ' View the LastIn Item in the Stack. Leave Stack unchanged Dim Pos If mCount > 0 Then Pos = InStr(mStacks, vbNullChar) ' Locate vbNullChar If Pos > 0 Then LastIn = Left(mStacks, Pos - 1) ' Extract the LastIn Item End If End If End Function
  18. Baṇ có thể download chương triǹ h mâũ SXMLParser.zip Đăc̣ biêṭ trong program nâỳ , chỉ câǹ môṭ click duy nhất lên nút Paste, XML text trong Clipboard sẽ đươc̣ biến thành HTML code để làm đep̣ và hiển thi ̣XML code với màu trong WebBrowser. Ngay sau đó baṇ có thể Paste content của Clipboard vào môṭ trang Web. Dưới đây là listing của Sub CmdPaste_Click Private Sub CmdPaste_Click() ' Parse the Clipboard content and copy the resultant colour HTML back to clipboard Dim i, TStr ' Fetch content of clipboard TStr = Clipboard.GetText(vbCFText) ' Write it temporarily to "Temp.XML" file in the same folder where this program resides
  19. WriteTextFile GetLocalDirectory & "Temp.XML", TStr ' Place the XML filename into TextBox txtFilename txtFilename.Text = GetLocalDirectory & "Temp.XML" ' Emulating User's action of clicking the commandbutton Parse cmdParse_Click ' If there're something as a result, copy everything from the Listbox lstHTML ' except for the first and last line, which contain HTML header/footer. ' Select the required lines from the Textbox If lstHTML.ListCount > 2 Then For i = 1 To lstHTML.ListCount - 2 lstHTML.Selected(i) = True Next ' Emulating User's action of clicking the commandbutton Copy CmdCopy_Click End If End Sub
  20. Kỹ thuâṭ XML Vovisoft © 2000. All rights reserved. Last Updated: 25 July 2001 Webmaster