[gxml] Fixed GElement get_nodes_by* methods
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] Fixed GElement get_nodes_by* methods
- Date: Wed, 20 Jul 2016 21:30:59 +0000 (UTC)
commit 0d0e6d0fb298a229592394e16b32b76e64cd252c
Author: Daniel Espinosa <esodan gmail com>
Date: Wed Jul 20 16:28:33 2016 -0500
Fixed GElement get_nodes_by* methods
Fixed get_nodes_by_tag_name(), get_nodes_by_tag_name_ns() and
get_nodes_by_class_name()
Added Unit Test.
gxml/GXmlElement.vala | 39 +++++++++++++++++----------------------
test/DomGDocumentTest.vala | 35 ++++++++++++++++++++++++++++++++++-
2 files changed, 51 insertions(+), 23 deletions(-)
---
diff --git a/gxml/GXmlElement.vala b/gxml/GXmlElement.vala
index b969b33..e1af184 100644
--- a/gxml/GXmlElement.vala
+++ b/gxml/GXmlElement.vala
@@ -241,28 +241,20 @@ public class GXml.GElement : GXml.GNonDocumentChildNode,
public DomHTMLCollection get_elements_by_tag_name (string local_name) {
var l = new GDomHTMLCollection ();
- foreach (GXml.DomNode n in child_nodes) {
- if (!(n is GXml.DomElement)) continue;
+ foreach (GXml.DomElement n in children) {
+ l.add_all (n.get_elements_by_tag_name (local_name));
if (n.node_name == local_name)
l.add ((DomElement) n);
- l.add_all ((n as DomElement).get_elements_by_tag_name (local_name));
}
return l;
}
public DomHTMLCollection get_elements_by_tag_name_ns (string? namespace, string local_name) {
var l = new GDomHTMLCollection ();
- string prefix = null;
- string uri = namespace;
- if (":" in namespace) {
- string[] s = namespace.split (":");
- prefix = s[0];
- uri = s[1];
- }
- foreach (GXml.DomNode n in child_nodes) {
- if (!(n is GXml.DomElement)) continue;
- if ((n as GXml.DomElement).node_name == local_name
- && n.lookup_namespace_uri (prefix) == uri)
- l.add ((DomElement) n);
+ foreach (GXml.DomElement n in children) {
+ l.add_all (n.get_elements_by_tag_name_ns (namespace, local_name));
+ if (n.node_name == local_name
+ && n.namespace_uri == namespace)
+ l.add (n);
}
return l;
}
@@ -278,15 +270,18 @@ public class GXml.GElement : GXml.GNonDocumentChildNode,
l.add_all (n.get_elements_by_class_name (class_names));
string cls = n.get_attribute ("class");
if (cls == null) continue;
- foreach (string s in cs) {
- if (" " in cls) {
- string[] ncls = cls.split (" ");
- foreach (string snc in ncls) {
- if (snc == s) l.add (n);
+ string[] ncls = {};
+ if (" " in cls)
+ ncls = cls.split (" ");
+ else
+ ncls += cls;
+ foreach (string cl in cs) {
+ foreach (string ncl in ncls) {
+ if (cl == ncl) {
+ l.add (n);
+ break;
}
}
- else
- if (s == cls) l.add (n);
}
}
return l;
diff --git a/test/DomGDocumentTest.vala b/test/DomGDocumentTest.vala
index 1c5f96d..956c2f8 100644
--- a/test/DomGDocumentTest.vala
+++ b/test/DomGDocumentTest.vala
@@ -229,7 +229,6 @@ static const string HTMLDOC ="
pn4.set_attribute ("id", "newp2");
pn4.set_attribute ("class", "black");
p.replace_child (pn4, p.child_nodes[0]);
- GLib.message ("BODY:"+(p as GXml.Node).to_string ());
assert (p.children.length == 7);
assert (p.children[0] is DomElement);
assert (p.children[0].node_name == "p");
@@ -247,6 +246,40 @@ static const string HTMLDOC ="
assert (ng2.lookup_namespace_uri (null) == "http://live.gnome.org/GXml");
assert (ng2.lookup_prefix ("http://live.gnome.org/GXml") == null);
assert (ng2.tag_name == "OtherNode");
+
+ GLib.message ("BODY:"+(doc.document_element as GXml.Node).to_string ());
+ var l = doc.document_element.get_elements_by_tag_name ("p");
+ assert (l != null);
+ assert (l is DomHTMLCollection);
+ assert (l.length == 4);
+ assert (l[0] is DomElement);
+ assert (l[1] is DomElement);
+ assert (l[1] is DomElement);
+ assert (l[0].node_name == "p");
+ assert (l[1].node_name == "p");
+ assert (l[2].node_name == "p");
+ assert (doc.document_element.children.length == 1);
+ var lnst = doc.document_element.get_elements_by_tag_name ("OtherNode");
+ assert (lnst.length == 1);
+ var nnst = lnst.item (0);
+ assert (nnst.namespace_uri == "http://live.gnome.org/GXml");
+ var lns = doc.document_element.get_elements_by_tag_name_ns
("http://live.gnome.org/GXml", "OtherNode");
+ assert (lns != null);
+ assert (lns is DomHTMLCollection);
+ GLib.message ("Node with default ns: "+lns.length.to_string ());
+ assert (lns.length == 1);
+ assert (lns.item (0) is DomElement);
+ assert (lns.item (0).node_name == "OtherNode");
+ var lcl = doc.document_element.get_elements_by_class_name ("black");
+ assert (lcl != null);
+ assert (lcl is DomHTMLCollection);
+ assert (lcl.length == 3);
+ assert (lcl.item (0) is DomElement);
+ assert (lcl.item (1) is DomElement);
+ assert (lcl.item (2) is DomElement);
+ assert (lcl.item (0).node_name == "p");
+ assert (lcl.item (1).node_name == "p");
+ assert (lcl.item (2).node_name == "p");
} catch (GLib.Error e) {
GLib.message ("Error: "+e.message);
assert_not_reached ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]