[gxml] First implementation of XPath based on libxml2
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] First implementation of XPath based on libxml2
- Date: Thu, 29 Sep 2016 15:41:50 +0000 (UTC)
commit 27e8fb223cbde1bade4b79563514511db7842841
Author: Yannick Inizan <inizan yannick gmail com>
Date: Thu Sep 29 10:41:02 2016 -0500
First implementation of XPath based on libxml2
gxml/DomElement.vala | 9 +++++++++
gxml/GXmlElement.vala | 23 +++++++++++++++++++++++
gxml/Makefile.am | 1 +
3 files changed, 33 insertions(+), 0 deletions(-)
---
diff --git a/gxml/DomElement.vala b/gxml/DomElement.vala
index f28da7b..bae3d8d 100644
--- a/gxml/DomElement.vala
+++ b/gxml/DomElement.vala
@@ -56,6 +56,15 @@ public interface GXml.DomElement : GLib.Object,
public abstract DomHTMLCollection get_elements_by_tag_name(string local_name);
public abstract DomHTMLCollection get_elements_by_tag_name_ns (string? namespace, string local_name);
public abstract DomHTMLCollection get_elements_by_class_name (string class_names);
+
+ /**
+ * Evaluate XPath expression.
+ *
+ * This method evaluates provided expression, registers provided namespaces in resolver and returns an
{@link GXml.XPath.Object}.
+ *
+ * Throw {@link GXml.XPath.Error} if one of provided namespaces is invalid.
+ */
+ public abstract GXml.XPath.Object evaluate (string expression, Gee.List<GXml.Namespace>? resolver = null)
throws GXml.XPath.Error;
}
public class GXml.DomElementList : Gee.ArrayList<DomElement>, GXml.DomHTMLCollection {
diff --git a/gxml/GXmlElement.vala b/gxml/GXmlElement.vala
index d5f3d04..1a2211c 100644
--- a/gxml/GXmlElement.vala
+++ b/gxml/GXmlElement.vala
@@ -316,4 +316,27 @@ public class GXml.GElement : GXml.GNonDocumentChildNode,
// FIXME:
throw new DomError.SYNTAX_ERROR (_("DomElement query_selector_all is not implemented"));
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public GXml.XPath.Object evaluate (string expression, Gee.List<GXml.Namespace>? resolver = null) throws
GXml.XPath.Error {
+ if (!(this is GXml.Node))
+ return null;
+ string data = (this as GXml.Node).to_string();
+ var ndoc = Xml.Parser.read_memory (data, data.length);
+ var gdoc = new GXml.GDocument.from_doc (ndoc);
+ var context = new Xml.XPath.Context (ndoc);
+ if (resolver != null)
+ resolver.foreach (ns => {
+ int res = context.register_ns (ns.prefix, ns.uri);
+ if (res != 0) {
+ var err = new GXml.XPath.Error.EXPRESSION_OK ("invalid namespace.");
+ err.code = res;
+ throw err;
+ }
+ return true;
+ });
+ return new GXml.XPath.Object (gdoc, context.eval (expression));
+ }
}
diff --git a/gxml/Makefile.am b/gxml/Makefile.am
index 1de2fac..f708ccf 100644
--- a/gxml/Makefile.am
+++ b/gxml/Makefile.am
@@ -109,6 +109,7 @@ sources = \
DomMutationObservers.vala \
DomNode.vala \
DomRange.vala \
+ XPath.vala \
$(NULL)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]