Imports System Imports System.Text Imports System.Diagnostics Imports Xmlsq ' ' * $Id: TestXmlsq.vb $ ' * Last updated: ' * $Date: 2021-07-17 09:13 $ ' * $Version: 1.0.0 $ ' ' Some tests using the XMLSQ .NET interface. ' * ' * Requires `xmlsq` to be installed on your system: available from <http://cryptosys.net/xmlsq/> ' * Add a reference to `diXmlsqNet.dll` ' * ' * Test files, e.g. `bookstore.xml`, are in `xmlsq-testfiles.zip`. These must be in the CWD. ' * ' * This is a Console Application written for target .NET Framework 4.0 and above ' * Please report any bugs to <https://cryptosys.net/contact> ' '****************************** LICENSE *********************************** ' * Copyright (C) 2020-21 David Ireland, DI Management Services Pty Limited. ' * All rights reserved. <www.di-mgt.com.au> <www.cryptosys.net> ' * The code in this module is licensed under the terms of the MIT license. ' * For a copy, see <http://opensource.org/licenses/MIT> '**************************************************************************** ' ' Ported from C# to VB.NET using icsharpcode.net's SharpDevelop. Namespace TestXmlsq Class TestXmlsq Private Const MIN_VERSION As Integer = 10000 Private Shared Function quote_str(s As String) As String Return "'" & s & "'" End Function Private Shared Sub test_Bookstore() Dim n As Integer Dim s As String, query__1 As String Dim xmlfile As String xmlfile = "bookstore.xml" Console.WriteLine("FILE: {0}", xmlfile) Console.WriteLine("Get the root element...") query__1 = "/" s = Query.GetText(xmlfile, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(s) Console.WriteLine("Get text of 2nd title element...") query__1 = "(//title)[2]" s = Query.GetText(xmlfile, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(s) Console.WriteLine("Get count of book elements...") query__1 = "//book" n = Xmlsq.Query.Count(xmlfile, query__1) Console.WriteLine("COUNT: Query: {0}", query__1) Console.WriteLine(n) Console.WriteLine("Get text of first book element...") query__1 = "//book" s = Query.GetText(xmlfile, query__1) Console.WriteLine("GETTEXT: Query: {0}", query__1) Console.WriteLine(s) Console.WriteLine("Full Xpath query...") query__1 = "//book" s = Query.FullQuery(xmlfile, query__1) Console.WriteLine("FULLQUERY: Query: {0}", query__1) Console.WriteLine(s) Console.WriteLine("Get text of first title element...") query__1 = "//title" s = Query.GetText(xmlfile, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(s) Console.WriteLine("Full Xpath query...") query__1 = "//title" Console.WriteLine("Query: {0}", query__1) s = Query.FullQuery(xmlfile, query__1) Console.WriteLine(s) Console.WriteLine("Full Xpath query with `raw` option...") query__1 = "//title" Console.WriteLine("Query: {0}", query__1) s = Query.FullQuery(xmlfile, query__1, Query.Opts.Raw) Console.WriteLine(s) Console.WriteLine("Get text of 3rd title element (UTF-8-encoded)...") query__1 = "(//title)[3]" Console.WriteLine("Query: {0}", query__1) s = Query.GetText(xmlfile, query__1) Console.WriteLine(s) Console.WriteLine("Get text of 3rd title element asciified...") query__1 = "(//title)[3]" Console.WriteLine("Query: {0}", query__1) s = Query.GetText(xmlfile, query__1, Query.Opts.Asciify) Console.WriteLine(s) Console.WriteLine("Get text of 3rd title element converted to native .NET UTF-16 string...") query__1 = "(//title)[3]" Console.WriteLine("Query: {0}", query__1) s = Query.GetText(xmlfile, query__1) ' Convert a string containing UTF-8 to a native .NET UTF-16 string s = Encoding.UTF8.GetString(Encoding.[Default].GetBytes(s)) ' Should now print OK in .NET Console.WriteLine(s) End Sub Private Shared Sub test_UseCount() Dim n As Integer Dim s As String, query__1 As String Dim xmlfile As String Console.WriteLine(vbLf & "USE THE COUNT TO QUERY EACH MATCHING ELEMENT...") xmlfile = "bookstore.xml" Console.WriteLine("FILE: {0}", xmlfile) Console.WriteLine("Use the count to query each matching element in turn...") query__1 = "//title" n = Xmlsq.Query.Count(xmlfile, query__1) Console.WriteLine("COUNT: Query: {0}", query__1) Console.WriteLine(n) For i As Integer = 1 To n ' Compose query query__1 = String.Format("(//title)[{0}]", i) Console.WriteLine("Query: {0}", query__1) ' then use it s = Query.GetText(xmlfile, query__1, Query.Opts.Asciify) Console.WriteLine(s) Next End Sub Private Shared Sub test_Errors() Dim n As Integer Dim s As String, query__1 As String Dim xmlfile As String Console.WriteLine(vbLf & "EXPECTING ERRORS...") xmlfile = "bookstore.xml" query__1 = "///badquery" Console.WriteLine("Query: {0}", query__1) Try s = Query.GetText(xmlfile, query__1) Catch e As XmlsqErrorException Console.WriteLine(e.Message) End Try xmlfile = "missing.xml" query__1 = "//title" Console.WriteLine("FILE: {0}", xmlfile) Console.WriteLine("Query: {0}", query__1) Try s = Query.GetText(xmlfile, query__1) Catch e As XmlsqErrorException Console.WriteLine(e.Message) End Try xmlfile = "notxml.txt" query__1 = "/a" Console.WriteLine("FILE: {0}", xmlfile) Console.WriteLine("Query: {0}", query__1) Try s = Query.GetText(xmlfile, query__1) Catch e As XmlsqErrorException Console.WriteLine(e.Message) End Try xmlfile = "missing.xml" query__1 = "//title" Console.WriteLine("FILE: {0}", xmlfile) Console.WriteLine("Query: {0}", query__1) Try n = Query.Count(xmlfile, query__1) Catch e As XmlsqErrorException Console.WriteLine(e.Message) End Try End Sub Private Shared Sub test_Empty() Dim n As Integer Dim s As String, query__1 As String Console.WriteLine(vbLf & "TESTING FOR EMPTY VALUES...") ' Pass XML as a string Dim xml As String = "<a><b foo=''></b><c>test1</c><e /></a>" Console.WriteLine("xml={0}", xml) Console.WriteLine("Get text of element b (empty, so add quote delimiters to see something)...") query__1 = "a/b" s = Query.GetText(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(quote_str(s)) Console.WriteLine("Similarly for empty element <e />...") query__1 = "//e" s = Query.GetText(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(quote_str(s)) Console.WriteLine("And for empty attribute foo=""""...") query__1 = "//b/@foo" s = Query.GetText(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(quote_str(s)) Console.WriteLine("But we get the same result if the element is missing...") query__1 = "//notthere" s = Query.GetText(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(quote_str(s)) Console.WriteLine("And if the attribute is not there...") query__1 = "//b/@baz" s = Query.GetText(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(quote_str(s)) Console.WriteLine("To differentiate: use the Query.Count method...") query__1 = "//e" n = Query.Count(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine("Count={0}", n) query__1 = "//notthere" n = Query.Count(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine("Count={0}", n) query__1 = "//b/@foo" n = Query.Count(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine("Count={0}", n) query__1 = "//b/@baz" n = Query.Count(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine("Count={0}", n) End Sub Private Shared Sub test_Whitespace() Dim s As String, query__1 As String Console.WriteLine(vbLf & "IGNORABLE WHITESPACE...") ' Pass XML as a string Dim xml As String = "<a foo = ' val de ri '> hello world </a>" Console.WriteLine("xml={0}", xml) query__1 = "/a" s = Query.GetText(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(quote_str(s)) Console.WriteLine("-- with Trim option (note whitespace in middle of element content is unchanged)") s = Query.GetText(xml, query__1, Query.Opts.Trim) Console.WriteLine(quote_str(s)) query__1 = "/a/@foo" s = Query.GetText(xml, query__1) Console.WriteLine("Query: {0}", query__1) Console.WriteLine(quote_str(s)) Console.WriteLine("-- with Trim option (note whitespace inside attribute value is collapsed)") s = Query.GetText(xml, query__1, Query.Opts.Trim) Console.WriteLine(quote_str(s)) End Sub Public Shared Sub Main(args As String()) ' Make sure minimum required version of core DLL is installed... Console.WriteLine("Xmlsq core DLL Version={0:D5}", Xmlsq.Gen.Version()) If Gen.Version() < MIN_VERSION Then Console.WriteLine("FATAL ERROR: Require DLL version " & MIN_VERSION & " or later.") Return End If Console.WriteLine("This .NET module Version={0}", Xmlsq.Gen.NetVersion()) ' Handle command-line arguments ' [some] just do some tests (default = do all) Dim doSome As Boolean = False For iarg As Integer = 0 To args.Length - 1 If args(iarg) = "some" Then doSome = True End If Next '************* ' DO THE TESTS '************* If doSome Then ' Use "some" in the command line ' Do some tests - comment these out as required 'test_Bookstore(); 'test_Errors(); 'test_Empty(); 'test_UseCount(); test_Whitespace() Else ' Do all the test modules (default) test_Bookstore() test_Errors() test_Empty() test_UseCount() test_Whitespace() End If ' FINALLY, DISPLAY QUICK INFO ABOUT THE CORE DLL Console.WriteLine(vbLf & "DETAILS OF CORE DLL...") Console.WriteLine("DLL Version={0:D5} [{1}] Compiled=[{2}] ", Gen.Version(), Gen.Platform(), Gen.CompileTime()) Console.WriteLine("[{0}]", Gen.ModuleName()) End Sub End Class End Namespace