Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
171
rated 0 times [  178] [ 7]  / answers: 1 / hits: 20103  / 14 Years ago, tue, december 21, 2010, 12:00:00

I am looking for a Javascript solution to this problem:



I have an XML document which is loaded by way of a typical AJAX method:



var xml = http.responseXML;



Consider the following example xml snippet:



<main>
<primary>
<enabled>true</enabled>
</primary>
<secondary>
<enabled>true</enabled>
</secondary>
</main>


I would like to get the value of a node by specifying the path as follows:



var second_enabled = getNodeValueByPath('main/secondary/enabled', xml);


I cannot find any concise way of doing something like this. I seem to be forced to iterate through node collections after using getElementsByTagName and the like.



How would I construct the method getNodeValueByPath or is there some construct in Javascript that allows for this?



I am not well versed in Javascript.



EDIT: Here is an example that shows my attempt at using XPath and how it is failing:



XML:



<?xml version=1.0 ?>
<main xmlns=example.com>
<primary>
<enabled>true</enabled>
</primary>
<secondary>
<enabled>false</enabled>
</secondary>
</main>


JavaScript: (these are the relevant functions only)



function useHttpResponse()
{
if (http.readyState == 4)
{
if(http.status == 200)
{
var xml = http.responseXML;
var evalue = getXMLValueByPath('/main/secondary/enabled', xml);
alert(evalue);
}
}
}

function getXMLValueByPath(nodepath, xml)
{
var result = xml.evaluate(nodepath, xml, null, XPathResult.STRING_TYPE, null).stringValue;
return result;
}


I am using the above JavaScript without any additional libraries. I am using Mozilla Firefox 3.6.13 which uses the document.evaluate method to select nodes (according to this information from w3schools). This application is for internal use and does not have to work on multiple browsers.



Given these examples, the alert dialog will appear, but contain no text. If I remove the string xmlns=example.com from the XML document, the alert dialog appears with the text false as desired.



Debugging using Firebug shows that resultNode is an empty string as long as the namespace is declared.


More From » xml

 Answers
22

This is FAQ: In XPath 1.0, a QName test without prefix selects elements under the null (or empty) namespace URI. So you need to register a prefix to the default namespace URI from your input source (example.com).



How do you do that with DOM 3 XPath API?



From http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator-evaluate




evaluate

Evaluates an XPath
expression string and returns a result
of the specified type if possible.

Parameters

[...]

resolver of type XPathNSResolver

The resolver permits translation of all
prefixes, including the xml
namespace prefix, within the XPath
expression into appropriate namespace
URIs. If this is specified as null,
any namespace prefix within the
expression will result in
DOMException being thrown with the
code NAMESPACE_ERR.




And from https://developer.mozilla.org/en/DOM/document.evaluate




var xpathResult = document.evaluate(
xpathExpression,
contextNode,
namespaceResolver,
resultType,
result);



  • namespaceResolver is a function that will be passed any namespace prefixes and should return a string representing the namespace URI
    associated with that prefix. It will
    be used to resolve prefixes within
    the XPath itself, so that they can be
    matched with the document. null is
    common for HTML documents or when no
    namespace prefixes are used.




Following this guide, you can use document.createNSResolver or a function like:



function nsResolver(prefix) {   
return prefix == 'ex' ? 'example.com' : null;
}

function useHttpResponse()
{
if (http.readyState == 4)
{
if (http.status == 200)
{
var xml = http.responseXML;
var evalue = xml.evaluate('string(/ex:main/ex:secondary/ex:enabled)',
xml,
nsResolver,
XPathResult.STRING_TYPE,
null);
alert(evalue.stringValue);
}
}
}

[#94541] Friday, December 17, 2010, 14 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
shylaelisan

Total Points: 37
Total Questions: 94
Total Answers: 110

Location: Angola
Member since Tue, May 5, 2020
4 Years ago
;