using System; using System.Text; using System.Diagnostics; using Xmlsq; /* * $Id: TestXmlsq.cs $ * 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> **************************************************************************** */ namespace TestXmlsq { class TestXmlsq { private const int MIN_VERSION = 10000; static string quote_str(string s) { return "'" + s + "'"; } static void test_Bookstore() { int n; string s, query; string xmlfile; xmlfile = "bookstore.xml"; Console.WriteLine("FILE: {0}", xmlfile); Console.WriteLine("Get the root element..."); query = "/"; s = Query.GetText(xmlfile, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(s); Console.WriteLine("Get text of 2nd title element..."); query = "(//title)[2]"; s = Query.GetText(xmlfile, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(s); Console.WriteLine("Get count of book elements..."); query = "//book"; n = Xmlsq.Query.Count(xmlfile, query); Console.WriteLine("COUNT: Query: {0}", query); Console.WriteLine(n); Console.WriteLine("Get text of first book element..."); query = "//book"; s = Query.GetText(xmlfile, query); Console.WriteLine("GETTEXT: Query: {0}", query); Console.WriteLine(s); Console.WriteLine("Full Xpath query..."); query = "//book"; s = Query.FullQuery(xmlfile, query); Console.WriteLine("FULLQUERY: Query: {0}", query); Console.WriteLine(s); Console.WriteLine("Get text of first title element..."); query = "//title"; s = Query.GetText(xmlfile, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(s); Console.WriteLine("Full Xpath query..."); query = "//title"; Console.WriteLine("Query: {0}", query); s = Query.FullQuery(xmlfile, query); Console.WriteLine(s); Console.WriteLine("Full Xpath query with `raw` option..."); query = "//title"; Console.WriteLine("Query: {0}", query); s = Query.FullQuery(xmlfile, query, Query.Opts.Raw); Console.WriteLine(s); Console.WriteLine("Get text of 3rd title element (UTF-8-encoded)..."); query = "(//title)[3]"; Console.WriteLine("Query: {0}", query); s = Query.GetText(xmlfile, query); Console.WriteLine(s); Console.WriteLine("Get text of 3rd title element asciified..."); query = "(//title)[3]"; Console.WriteLine("Query: {0}", query); s = Query.GetText(xmlfile, query, Query.Opts.Asciify); Console.WriteLine(s); Console.WriteLine("Get text of 3rd title element converted to native .NET UTF-16 string..."); query = "(//title)[3]"; Console.WriteLine("Query: {0}", query); s = Query.GetText(xmlfile, query); // 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); } static void test_UseCount() { int n; string s, query; string xmlfile; Console.WriteLine("\nUSE 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 = "//title"; n = Xmlsq.Query.Count(xmlfile, query); Console.WriteLine("COUNT: Query: {0}", query); Console.WriteLine(n); for (int i = 1; i <= n; i++) { // Compose query query = string.Format("(//title)[{0}]", i); Console.WriteLine("Query: {0}", query); // then use it s = Query.GetText(xmlfile, query, Query.Opts.Asciify); Console.WriteLine(s); } } static void test_Errors() { int n; string s, query; string xmlfile; Console.WriteLine("\nEXPECTING ERRORS..."); xmlfile = "bookstore.xml"; query = "///badquery"; Console.WriteLine("Query: {0}", query); try { s = Query.GetText(xmlfile, query); } catch (XmlsqErrorException e) { Console.WriteLine(e.Message); } xmlfile = "missing.xml"; query = "//title"; Console.WriteLine("FILE: {0}", xmlfile); Console.WriteLine("Query: {0}", query); try { s = Query.GetText(xmlfile, query); } catch (XmlsqErrorException e) { Console.WriteLine(e.Message); } xmlfile = "notxml.txt"; query = "/a"; Console.WriteLine("FILE: {0}", xmlfile); Console.WriteLine("Query: {0}", query); try { s = Query.GetText(xmlfile, query); } catch (XmlsqErrorException e) { Console.WriteLine(e.Message); } xmlfile = "missing.xml"; query = "//title"; Console.WriteLine("FILE: {0}", xmlfile); Console.WriteLine("Query: {0}", query); try { n = Query.Count(xmlfile, query); } catch (XmlsqErrorException e) { Console.WriteLine(e.Message); } } static void test_Empty() { int n; string s, query; Console.WriteLine("\nTESTING FOR EMPTY VALUES..."); // Pass XML as a string string xml = @"<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 = "a/b"; s = Query.GetText(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(quote_str(s)); Console.WriteLine("Similarly for empty element <e />..."); query = "//e"; s = Query.GetText(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(quote_str(s)); Console.WriteLine("And for empty attribute foo=\"\"..."); query = "//b/@foo"; s = Query.GetText(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(quote_str(s)); Console.WriteLine("But we get the same result if the element is missing..."); query = "//notthere"; s = Query.GetText(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(quote_str(s)); Console.WriteLine("And if the attribute is not there..."); query = "//b/@baz"; s = Query.GetText(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(quote_str(s)); Console.WriteLine("To differentiate: use the Query.Count method..."); query = "//e"; n = Query.Count(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine("Count={0}", n); query = "//notthere"; n = Query.Count(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine("Count={0}", n); query = "//b/@foo"; n = Query.Count(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine("Count={0}", n); query = "//b/@baz"; n = Query.Count(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine("Count={0}", n); } static void test_Whitespace() { string s, query; Console.WriteLine("\nIGNORABLE WHITESPACE..."); // Pass XML as a string string xml = @"<a foo = ' val de ri '> hello world </a>"; Console.WriteLine("xml={0}", xml); query = "/a"; s = Query.GetText(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(quote_str(s)); Console.WriteLine("-- with Trim option (note whitespace in middle of element content is unchanged)"); s = Query.GetText(xml, query, Query.Opts.Trim); Console.WriteLine(quote_str(s)); query = "/a/@foo"; s = Query.GetText(xml, query); Console.WriteLine("Query: {0}", query); Console.WriteLine(quote_str(s)); Console.WriteLine("-- with Trim option (note whitespace inside attribute value is collapsed)"); s = Query.GetText(xml, query, Query.Opts.Trim); Console.WriteLine(quote_str(s)); } static void Main(string[] args) { // 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) { Console.WriteLine("FATAL ERROR: Require DLL version " + MIN_VERSION + " or later."); return; } Console.WriteLine("This .NET module Version={0}", Xmlsq.Gen.NetVersion()); // Handle command-line arguments // [some] just do some tests (default = do all) bool doSome = false; for (int iarg = 0; iarg < args.Length; iarg++) { if (args[iarg] == "some") doSome = true; } //************* // DO THE TESTS //************* if (doSome) // 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(); } // FINALLY, DISPLAY QUICK INFO ABOUT THE CORE DLL Console.WriteLine("\nDETAILS OF CORE DLL..."); Console.WriteLine("DLL Version={0:D5} [{1}] Compiled=[{2}] ", Gen.Version(), Gen.Platform(), Gen.CompileTime()); Console.WriteLine("[{0}]", Gen.ModuleName()); } } }