[gxml] StreamReader: can parse document's root property
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] StreamReader: can parse document's root property
- Date: Sun, 28 Jul 2019 04:04:49 +0000 (UTC)
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]