1 /* ************************************************************************
3 Overrides the Qooxdoo qx.xml.Element to handle the namespace prefixes!!
5 ************************************************************************ */
8 * Cross browser XML Element API
10 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/81f3de54-3b79-46dc-8e01-73ca2d94cdb5.asp
11 * http://developer.mozilla.org/en/docs/Parsing_and_serializing_XML
13 qx
.Class
.define("org.argeo.ria.util.Element",
19 * Selects the first XmlNode that matches the XPath expression.
21 * @param element {Element | Document} root element for the search
22 * @param query {String} XPath query
23 * @param NSMap (Object) A map matching namespace prefixes to namespace URIS;
24 * @return {Element} first matching element
25 * @signature function(element, query)
27 selectSingleNode
: qx
.core
.Variant
.select("qx.client",
29 "mshtml|opera": function(element
, query
, NSMap
) {
33 for(var prefix
in NSMap
){
34 namespaces
[i
] = 'xmlns:'+prefix
+'="'+NSMap
[prefix
]+'"';
37 var doc
= element
.ownerDocument
|| element
;
38 doc
.setProperty('SelectionNamespaces', namespaces
.join(" "));
41 return element
.selectSingleNode(query
);
45 "default": function(element
, query
, NSMap
)
48 this.__xpe
= new XPathEvaluator();
56 resolver = function(prefix
){
57 return NSMap
[prefix
] || null;
60 resolver
= xpe
.createNSResolver(element
);
62 //return xpe.evaluate(query, element, xpe.createNSResolver(element), XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
63 return xpe
.evaluate(query
, element
, resolver
, XPathResult
.FIRST_ORDERED_NODE_TYPE
, null).singleNodeValue
;
65 throw new Error("selectSingleNode: query: " + query
+ ", element: " + element
+ ", error: " + err
);
72 * Selects a list of nodes matching the XPath expression.
74 * @param element {Element | Document} root element for the search
75 * @param query {String} XPath query
76 * @param NSMap {Map} Mapping between namespaces prefixes and URI.
77 * @return {Element[]} List of matching elements
78 * @signature function(element, query)
80 selectNodes
: qx
.core
.Variant
.select("qx.client",
82 "mshtml|opera": function(element
, query
, NSMap
) {
86 for(var prefix
in NSMap
){
87 namespaces
[i
] = 'xmlns:'+prefix
+'="'+NSMap
[prefix
]+'"';
90 var doc
= element
.ownerDocument
|| element
;
91 doc
.setProperty('SelectionNamespaces', namespaces
.join(" "));
93 return element
.selectNodes(query
);
96 "default": function(element
, query
, NSMap
)
101 this.__xpe
= xpe
= new XPathEvaluator();
107 resolver = function(prefix
){
108 return NSMap
[prefix
] || null;
111 resolver
= xpe
.createNSResolver(element
);
113 //var result = xpe.evaluate(query, element, xpe.createNSResolver(element), XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
114 var result
= xpe
.evaluate(query
, element
, resolver
, XPathResult
.ORDERED_NODE_SNAPSHOT_TYPE
, null);
116 throw new Error("selectNodes: query: " + query
+ ", element: " + element
+ ", error: " + err
);
120 for (var i
=0; i
<result
.snapshotLength
; i
++) {
121 nodes
[i
] = result
.snapshotItem(i
);
130 * Returns a list of elements with the given tag name belonging to the given namespace (http://developer.mozilla.org/en/docs/DOM:element.getElementsByTagNameNS).
132 * @param element {Element | Document} the element from where the search should start.
133 * Note that only the descendants of this element are included in the search, not the node itself.
134 * @param namespaceURI {var} is the namespace URI of elements to look for . For example, if you need to look
135 * for XHTML elements, use the XHTML namespace URI, <tt>http://www.w3.org/1999/xhtml</tt>.
136 * @param tagname {String} the tagname to look for
137 * @return {Element[]} a list of found elements in the order they appear in the tree.
138 * @signature function(element, namespaceURI, tagname)
140 getElementsByTagNameNS
: qx
.core
.Variant
.select("qx.client",
142 "mshtml": function(element
, namespaceURI
, tagname
)
144 var doc
= element
.ownerDocument
|| element
;
146 doc
.setProperty("SelectionLanguage", "XPath");
147 doc
.setProperty("SelectionNamespaces", "xmlns:ns='" + namespaceURI
+ "'");
149 return qx
.xml
.Element
.selectNodes(element
, 'descendant-or-self::ns:' + tagname
);
152 "default": function(element
, namespaceURI
, tagname
) {
153 return element
.getElementsByTagNameNS(namespaceURI
, tagname
);
159 * Selects the first XmlNode that matches the XPath expression and returns the text content of the element
161 * @param element {Element|Document} root element for the search
162 * @param query {String} XPath query
163 * @param NSMap {Object} Mapping between NS prefix / uri
164 * @return {String} the joined text content of the found element or null if not appropriate.
165 * @signature function(element, query)
167 getSingleNodeText : function(element
, query
, NSMap
)
169 var node
= this.selectSingleNode(element
, query
, NSMap
);
170 return qx
.dom
.Node
.getText(node
);