Skip to content Skip to sidebar Skip to footer

Different Results Selecting Html Elements With Xpath In Firefox And Internet Explorer

I'm trying to select a specific HTML element in a document, for firefox i just use: xpathobj = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NOD

Solution 1:

Take a look at http://dev.abiss.gr/sarissa/ project. They have migrated most of XML-related APIs to IE. Otherwise it is indeed also easy to implement. The problems you would need to solve would be: serialization of HTML into valid XML, syncing result of XMLDOM XPath query with original HTMLDOM. To my knowledge they've done it in their library, however, its performance could have been better.

Solution 2:

The problem may be that in IE5+ [1] is in fact [2] in FF. Microsoft solely decided that the numbering should start at [0] and not [1] as specified by w3c.

Solution 3:

Hi well in the end i came up with my own dodgy solution, any sugestions on improving it would be greatly apreciated. It makes use of some prototype functionality:

Works in IE5+ with xpath of the form "/HTML/BODY/DIV[9]/DIV[2]"

function getXPathElement (xpath , element) {

//Specific to project, here i know that the body element will always have the id "top"//but otherwise the element that is passed in should be first element in the xpath //statement eg. /HTML/BODY/DIV the element passed in should be HTMLif(!element){
    element = $("top");
    var xpathArrayIndex = 3;
} else {
    var xpathArrayIndex = 1;
}
//split the xpath statement upvar xpathArray = xpath.split("/");

var carryOn = true; 
while(carryOn){
    decendents = element.childElements();
    //check to see if we are at the end of the xpath statementif(xpathArrayIndex == xpathArray.length){
        return element;
    }
    //if there is only one decendent make it the next elementif(decendents.size() == 1) {
        element = decendents.first();
    } else {
    //otherwise search the decendents for the next element
        element = getXPathElementByIndex(decendents, xpathArray[xpathArrayIndex]);
    }
    xpathArrayIndex++;
}

}

function getXPathElementByIndex(decendents, xpathSegment){

var decendentsArray = decendents.toArray();
//seperate the index from the element namevar temp = xpathSegment.split("[");
var elementName = temp[0];
//get the index as a number eg. "9]" to 9var elementIndex = +temp[1].replace("]", "");
//the number of matching elementsvar count = 0;

//keeps track of the number of iterationsvar i = 0;
while(count != elementIndex) {
    //if the decendent's name matches the xpath element name increment the countif(decendentsArray[i].nodeName == elementName){
        count++;
    }
    i++;
}
var element = decendentsArray[i - 1];
return element;

}

Thanks to everyone for thier help, either way i learnt a fair bit about various javascript frameworks.

Solution 4:

There are some bugs in oly1234's code I try to fix it as follows:

functiongetXPathElement(xpath, element){
if(!element){
    element = document;
}
var xpathArray = xpath.split("/");

element = findXPathRoot(xpathArray[0],xpathArray[1],element);

for(var i=1; i<xpathArray.length; i++){
    if(xpathArray[i].toLowerCase()=="html"){
        continue;
    }
    if(!element){
        return element;
    }
    element = getXPathElementByIndex(element.childNodes,xpathArray[i]);         
}
return element;
}


functionfindXPathRoot(rootPath,htmlPath,element){
if(rootPath == ""&&htmlPath.toLowerCase() == "html"){
    return element.documentElement;
}
returndocument.getElementsByTagName(rootPath)[0];
}
functiongetXPathElementByIndex(decendents, xpathSegment){
//seperate the index from the element namevar temp = xpathSegment.split("[");
var elementName = temp[0];
//get the index as a number eg. "9]" to 9if(temp[1]){
    var elementIndex = temp[1].replace("]", "");
}else{
    var elementIndex = 1;
}
//the number of matching elementsvar count = 0;
for(var i=0;i < decendents.length; i++){
    if (decendents[i].nodeName.toLowerCase() == elementName.toLowerCase()) {
        count++;
        if(count==elementIndex){
            return decendents[i];
        }
    }
}
returnnull;
}

Solution 5:

Are you sure X-Path is implemented in your version of Internet Explorer? As in: what version are you using?

Post a Comment for "Different Results Selecting Html Elements With Xpath In Firefox And Internet Explorer"