[gxml] StreamReader: implement parse Processing Instructions
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] StreamReader: implement parse Processing Instructions
- Date: Mon, 1 Jun 2020 04:06:56 +0000 (UTC)
commit 422890f9d401379473b0bd5f4cd6f654afa71514
Author: Daniel Espinosa <esodan gmail com>
Date: Sun May 31 20:35:54 2020 -0500
StreamReader: implement parse Processing Instructions
Can process PI at document level related to #38
gxml/StreamReader.vala | 58 +++++++++++++++++++++++++++++++++-------------
test/StreamReaderTest.vala | 39 +++++++++++++++++++++++++++++++
2 files changed, 81 insertions(+), 16 deletions(-)
---
diff --git a/gxml/StreamReader.vala b/gxml/StreamReader.vala
index 686e8ef..243d8c2 100644
--- a/gxml/StreamReader.vala
+++ b/gxml/StreamReader.vala
@@ -318,7 +318,11 @@ public class GXml.StreamReader : GLib.Object {
}
}
private void parse_comment_dec () throws GLib.Error {
- read_byte ();
+ try {
+ read_byte ();
+ } catch {
+ return;
+ }
if (cur_char () != '-') {
throw new StreamReaderError.INVALID_DOCUMENT_ERROR (_("Invalid comment declaration"));
}
@@ -349,7 +353,43 @@ public class GXml.StreamReader : GLib.Object {
}
private void parse_pi_dec () throws GLib.Error
{
-
+ try {
+ read_byte ();
+ } catch {
+ return;
+ }
+ GLib.StringBuilder str = new GLib.StringBuilder ("");
+ while (!is_space (cur_char ())) {
+ if (cur_char () == '?') {
+ throw new StreamReaderError.INVALID_DOCUMENT_ERROR (_("Invalid Processing Instruccion's target
declaration"));
+ }
+ str.append_c (cur_char ());
+ try {
+ read_byte ();
+ } catch {
+ return;
+ }
+ }
+ string target = str.str;
+ str.assign ("");
+ while (cur_char () != '?') {
+ str.append_c (cur_char ());
+ try {
+ read_byte ();
+ } catch {
+ return;
+ }
+ }
+ var pi = document.create_processing_instruction (target, str.str);
+ document.append_child (pi);
+ try {
+ read_byte ();
+ } catch {
+ return;
+ }
+ if (cur_char () != '>') {
+ throw new StreamReaderError.INVALID_DOCUMENT_ERROR (_("Invalid Processing Instruccion's close
declaration"));
+ }
}
private void read_text_node () throws GLib.Error {
GLib.StringBuilder text = new GLib.StringBuilder ("");
@@ -381,18 +421,4 @@ public class GXml.StreamReader : GLib.Object {
private bool is_space (char c) {
return c == 0x20 || c == 0x9 || c == 0xA || c == ' ' || c == '\t' || c == '\n';
}
- private inline void skip_spaces () throws GLib.Error {
- try {
- read_byte ();
- } catch {
- return;
- }
- while (is_space (cur_char ())) {
- try {
- read_byte ();
- } catch {
- return;
- }
- }
- }
}
diff --git a/test/StreamReaderTest.vala b/test/StreamReaderTest.vala
index ed893cc..bb16712 100644
--- a/test/StreamReaderTest.vala
+++ b/test/StreamReaderTest.vala
@@ -360,6 +360,45 @@ class GXmlTest {
loop.quit ();
return Source.REMOVE;
});
+ loop.run ();
+ });
+ Test.add_func ("/gxml/stream-reader/pi", () => {
+ var loop = new GLib.MainLoop (null);
+ Idle.add (()=>{
+ string str = """<?xml version="1.0"?>
+<?test-instruction CONTENT IN PI?>
+<BookStore>
+</BookStore>
+""";
+ message ("Stream with PI");
+ var doc = new Library ();
+ try {
+ doc.read (str);
+ bool found = false;
+ for (int i = 0; i < doc.child_nodes.length; i++) {
+ var n = doc.child_nodes.item (i);
+ if (n is DomProcessingInstruction) {
+ found = true;
+ message ("Text: '%s'", ((DomProcessingInstruction)
n).target);
+ assert ("test-instruction" ==
((DomProcessingInstruction) n).target);
+ assert (" CONTENT IN PI" ==
((DomProcessingInstruction) n).data);
+ }
+ if (n is DomElement) {
+ message ("Element: %s", n.node_name);
+ }
+ }
+ assert (found);
+ assert (doc.store != null);
+ message (doc.write_string ());
+ assert (doc.document_element != null);
+ message ("Is BookStore?");
+ assert (doc.document_element is BookStore);
+ } catch (GLib.Error e) {
+ warning ("Error while reading stream: %s", e.message);
+ }
+ loop.quit ();
+ return Source.REMOVE;
+ });
loop.run ();
});
Test.run ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]