[gxml] StreamReader: can parse document's root property



commit 1d6c92c19de29c92356b1b6fcc6693c856462427
Author: Daniel Espinosa <esodan gmail com>
Date:   Wed Jul 24 18:29:13 2019 -0500

    StreamReader: can parse document's root property

 gxml/Document.vala         |  5 ++++-
 gxml/Element.vala          |  2 ++
 gxml/StreamReader.vala     | 13 ++++++++++---
 test/StreamReaderTest.vala | 20 +++++++++++++++-----
 4 files changed, 31 insertions(+), 9 deletions(-)
---
diff --git a/gxml/Document.vala b/gxml/Document.vala
index c2da5f1..71a0aaf 100644
--- a/gxml/Document.vala
+++ b/gxml/Document.vala
@@ -101,7 +101,10 @@ public class GXml.Document : GXml.Node,
     Parser parser = get_xml_parser ();
     parser.read_file (file);
   }
-
+  /**
+   * Search, instantiate and append the element marked as root,
+   * with the nick equal to '::ROOT' (without ').
+   */
   public GXml.Element search_root_element_property () {
     GLib.Object obj = null;
     foreach (ParamSpec spec in this.get_class ().list_properties ()) {
diff --git a/gxml/Element.vala b/gxml/Element.vala
index 4714dfe..987d17f 100644
--- a/gxml/Element.vala
+++ b/gxml/Element.vala
@@ -819,7 +819,9 @@ public class GXml.Element : GXml.Node,
     if (read_buffer == null) {
       return;
     }
+    message ("REading: %s", node_name);
     read_from_string ((string) read_buffer.data);
+    message (write_string ());
     read_buffer = null;
     pool = new ThreadPool<GXml.Element>.with_owned_data ((element) => {
                          element.parse_buffer.begin ();
diff --git a/gxml/StreamReader.vala b/gxml/StreamReader.vala
index c7f75b6..9d0ff67 100644
--- a/gxml/StreamReader.vala
+++ b/gxml/StreamReader.vala
@@ -79,8 +79,7 @@ public class GXml.StreamReader : GLib.Object {
         throw new StreamReaderError.INVALID_DOCUMENT_ERROR (_("Invalid document: unexpected character before 
node's name"));
       }
     }
-    var re = read_root_element ();
-    document.append_child (re);
+    read_root_element ();
   }
   public GXml.Element read_root_element () throws GLib.Error {
     return read_element (true);
@@ -114,7 +113,15 @@ public class GXml.StreamReader : GLib.Object {
       dbuf.put_byte (read_byte ());
     }
     name_buf.put_byte ('\0', cancellable);
-    e = (GXml.Element) document.create_element ((string) oname_buf.get_data ());
+    if (document.document_element == null) {
+      e = (document as GXml.Document).search_root_element_property ();
+    }
+    if (e == null) {
+      e = (GXml.Element) document.create_element ((string) oname_buf.get_data ());
+      if (document.document_element == null) {
+        document.append_child (e);
+      }
+    }
     e.read_buffer = buf;
     if (is_empty) {
       return e;
diff --git a/test/StreamReaderTest.vala b/test/StreamReaderTest.vala
index 75a95d8..8b55e3b 100644
--- a/test/StreamReaderTest.vala
+++ b/test/StreamReaderTest.vala
@@ -262,12 +262,22 @@ class GXmlTest {
                                var doc = new Library ();
                                try {
                                        doc.read (str);
-                                       (doc.document_element as GXml.Element).parse_buffer.begin ((obj, 
res)=>{
+                                       assert (doc.document_element != null);
+                                       assert (doc.document_element is BookStore);
+                                       var bs = doc.document_element as BookStore;
+                                       assert (bs.child_nodes.length == 2);
+                                       foreach (DomNode n in bs.child_nodes) {
+                                               if (n is DomElement) {
+                                                       assert ((n as GXml.Element).read_buffer != null);
+                                               }
+                                       }
+                                       bs.parse_buffer.begin ((obj, res)=>{
                                                try {
-                                                               (doc.document_element as 
GXml.Element).parse_buffer.end (res);
-                                                               message (doc.write_string ());
-                                                               assert ((doc.document_element as 
GXml.Element).read_buffer == null);
-                                                               loop.quit ();
+                                                       bs.parse_buffer.end (res);
+                                                       message (doc.write_string ());
+                                                       assert (bs.read_buffer == null);
+                                                       assert (bs.books != null);
+                                                       loop.quit ();
                                                } catch (GLib.Error e) {
                                                        warning ("Error: %s", e.message);
                                                }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]