diff --git a/examples/vala/bookshelf.xml b/examples/vala/CreateAndSavingDocuments/bookshelf.xml similarity index 100% rename from examples/vala/bookshelf.xml rename to examples/vala/CreateAndSavingDocuments/bookshelf.xml diff --git a/examples/vala/example.vala b/examples/vala/CreateAndSavingDocuments/example.vala similarity index 100% rename from examples/vala/example.vala rename to examples/vala/CreateAndSavingDocuments/example.vala diff --git a/examples/vala/CreateAndSavingDocuments/meson.build b/examples/vala/CreateAndSavingDocuments/meson.build new file mode 100644 index 0000000000000000000000000000000000000000..c9603fbe393b494dbf2481efac61b2f0681c1393 --- /dev/null +++ b/examples/vala/CreateAndSavingDocuments/meson.build @@ -0,0 +1,4 @@ +executable('gxml-vala', 'example.vala', + link_with: [libgxml], + dependencies: [libgxml_deps, inc_rooth_dep] + ) diff --git a/examples/vala/XPathAndObjectMappingExample/ClassesForMapping.vala b/examples/vala/XPathAndObjectMappingExample/ClassesForMapping.vala new file mode 100644 index 0000000000000000000000000000000000000000..d7f8d17bc7139f38b74e5f451db8bc555a048c5d --- /dev/null +++ b/examples/vala/XPathAndObjectMappingExample/ClassesForMapping.vala @@ -0,0 +1,79 @@ +public class ValuteArray : GXml.ArrayList { + construct { + try { + initialize (typeof (Valute)); + } catch (Error e) { + error (e.message); + } + } +} + +public class ValCurs : GXml.Element { + public ValuteArray valutes { get; set; } + + construct { + try { + initialize ("ValCurs"); + set_instance_property ("valutes"); + } catch (Error e) { + error (e.message); + } + } +} + +public class Valute : GXml.Element { + public Name Name { get; set; } + public Nominal Nominal { get; set; } + public Value Value { get; set; } + + construct { + try { + initialize ("Valute"); + } catch (Error e) { + error (e.message); + } + } +} + +public class Name : GXml.Element { + construct { + try { + initialize ("Name"); + } catch (Error e) { + error (e.message); + } + } + public string value () { + return this.text_content; + } +} + +public class Nominal : GXml.Element { + construct { + try { + initialize ("Nominal"); + } catch (Error e) { + error (e.message); + } + } + public double value () { + return double.parse (this.text_content); + } +} + +public class Value : GXml.Element { + construct { + try { + initialize ("Value"); + } catch (Error e) { + error (e.message); + } + } + public double value () { + return double_comma_parse (this.text_content); + } +} + +public double double_comma_parse (string str) { + return double.parse (str.replace (",", ".")); +} \ No newline at end of file diff --git a/examples/vala/XPathAndObjectMappingExample/README.md b/examples/vala/XPathAndObjectMappingExample/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f1efbb2879a73b3af37e69d44fc3f528583fd4af --- /dev/null +++ b/examples/vala/XPathAndObjectMappingExample/README.md @@ -0,0 +1,20 @@ +# XML Object mapping and xpath example + +## Output +```shell + ❯❯❯ ./build/examples/vala/XPathAndObjectMappingExample/gxml +easy_way +Name = Гонконгских долларов +Value = 95.125200000000007 +Nominal = 10 +Hong Kong dollar to Russian ruble exchange rate = 9.51252 + + +mapping_way +Hong Kong dollar to Russian ruble exchange rate = 9.51252 +``` + +### Dependancies + * Meson build system [Get Meson](https://mesonbuild.com/Getting-meson.html) (`pip3 install --user meson`, or through your distribution's pkg manager) + * Vala Compiler [Deb based](https://packages.debian.org/search?keywords=valac), [Windows](https://wiki.gnome.org/Projects/Vala/ValaOnWindows) + * GXml 0.20 [src](https://wiki.gnome.org/GXml) \ No newline at end of file diff --git a/examples/vala/XPathAndObjectMappingExample/main.vala b/examples/vala/XPathAndObjectMappingExample/main.vala new file mode 100644 index 0000000000000000000000000000000000000000..8288512abaface61d02acdf89238ba24eb3300e0 --- /dev/null +++ b/examples/vala/XPathAndObjectMappingExample/main.vala @@ -0,0 +1,66 @@ + +void easy_xpath_way () { + prin (Log.METHOD); + + try { + var document = new GXml.XDocument.from_uri ("http://www.cbr.ru/scripts/XML_daily.asp"); + // not implemented yet? + // var value = ((GXml.XPathContext) document).evaluate ("/ValCurs/Valute[@ID=\"R01200\"]/Name").string_value; + // var nominal = ((GXml.XPathContext) document).evaluate ("/ValCurs/Valute[@ID=\"R01200\"]/Nominal").number_value; + + var name = ((GXml.XPathContext)document) + .evaluate ("/ValCurs/Valute[@ID=\"R01200\"]/Name") + .nodeset.to_array ()[0].text_content; + var nominal = ((GXml.XPathContext)document) + .evaluate ("/ValCurs/Valute[@ID=\"R01200\"]/Nominal") + .nodeset.to_array ()[0].text_content; + var value = ((GXml.XPathContext)document) + .evaluate ("/ValCurs/Valute[@ID=\"R01200\"]/Value") + .nodeset.to_array ()[0].text_content; + + double double_value = double_comma_parse (value); + double double_nominal = double.parse (nominal); + double result = double_value / double_nominal; + + prin (@"Name = $name"); + prin (@"Value = $double_value"); + prin (@"Nominal = $double_nominal"); + stdout.printf (@"Hong Kong dollar to Russian ruble exchange rate = %.5lf\n", result); + } catch (Error e) { + error (@"Bad URL: $(e.message)"); + } +} + +void mapping_way () { + prin (Log.METHOD); + + var file = File.new_for_uri ("http://www.cbr.ru/scripts/XML_daily.asp"); + var s = new ValCurs (); + try { + s.read_from_file (file); + double result = 0.0; + + foreach (var _valute in s.valutes) { + var valute = _valute as Valute; + if (valute.Name.text_content == "Гонконгских долларов") { + result = valute.Value.value () / valute.Nominal.value (); + } + } + stdout.printf ("Hong Kong dollar to Russian ruble exchange rate = %.5lf\n", result); + } catch (Error e) { + error (e.message); + } +} + +void main () { + easy_xpath_way (); + prin("\n"); + mapping_way (); +} + +// Automatically adds to_string to each argument and concatenates them. +[Print] +void prin (string s) { + stdout.printf (s + "\n"); + stdout.flush (); +} \ No newline at end of file diff --git a/examples/vala/XPathAndObjectMappingExample/meson.build b/examples/vala/XPathAndObjectMappingExample/meson.build new file mode 100755 index 0000000000000000000000000000000000000000..7bf0bbc9def9c71ccc9a5daf9394c99354692260 --- /dev/null +++ b/examples/vala/XPathAndObjectMappingExample/meson.build @@ -0,0 +1,7 @@ +sources = ['main.vala', 'ClassesForMapping.vala'] +executable(meson.project_name(), + sources, + link_with: [libgxml], + dependencies: [libgxml_deps, inc_rooth_dep] + ) + diff --git a/examples/vala/meson.build b/examples/vala/meson.build index c9603fbe393b494dbf2481efac61b2f0681c1393..2b1466e41345b577f9a6286f7c273c397f5fc955 100644 --- a/examples/vala/meson.build +++ b/examples/vala/meson.build @@ -1,4 +1,2 @@ -executable('gxml-vala', 'example.vala', - link_with: [libgxml], - dependencies: [libgxml_deps, inc_rooth_dep] - ) +subdir('CreateAndSavingDocuments') +subdir('XPathAndObjectMappingExample')