[gxml] First implementation of XPath based on libxml2



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]