Различные результаты, выбирающие элементы HTML с XPath в Firefox и Internet Explorer

Два замечания:

1- При попытке напечатать объект StudentCinstructor, если нет выделенного метода toString(), вы не получите хорошо структурированный вывод. Следовательно, вам нужно написать метод toString() для вашего класса, а затем вы можете вывести его на консоль. Пример:

public static String toString() {
     return "Customize here + Put this method inside your class";
}

2 - Я не понимаю, почему вы используете LinkedHashSet для хранения объектов StudentCinstructor, а затем сохраняете этот HashSet внутри карты вместо создания объекта StudentCinstructor и сохранения это непосредственно на карте, если у всех студентов есть уникальный идентификатор. Такие как:

HashMap<Integer, StudentCinstructor> st = new HashMap<>();

6
задан Wayne Burkett 20 December 2011 в 20:19
поделиться

10 ответов

Вы - верный XPath, реализован в Вашей версии Internet Explorer? Как в: какую версию Вы используете?

0
ответ дан 16 December 2019 в 21:48
поделиться

Привет хорошо в конце я предложил свое собственное изворотливое решение, любые предложения при улучшении, это будет значительно цениться. Это использует некоторую опытную функциональность:

Работы в IE5 + с xpath формы "/html/body/div [9] / DIV [2]"

функционируйте getXPathElement (xpath, элемент) {

//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 HTML
if(!element){
    element = $("top");
    var xpathArrayIndex = 3;
} else {
    var xpathArrayIndex = 1;
}
//split the xpath statement up
var xpathArray = xpath.split("/");

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

}

функционируйте getXPathElementByIndex (потомки, xpathSegment) {

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

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

}

Благодаря всем для их справки так или иначе я узнал немного о различных платформах JavaScript.

1
ответ дан 16 December 2019 в 21:48
поделиться

Смотрите на проект http://dev.abiss.gr/sarissa/. Они переместили большинство XML-связанных API в IE. Иначе действительно также легко реализовать. Проблемы, которые необходимо было бы решить, будут: сериализация HTML в допустимый XML, синхронизируя результат XPath XMLDOM запрашивает с исходным HTMLDOM. К моему знанию они сделали это в своей библиотеке, однако, ее производительность, возможно, была лучше.

3
ответ дан 16 December 2019 в 21:48
поделиться

Вместо выполнения

xmlDoc.load(document); 

попробовать

xmlDoc.loadXML(document.body.outerHTML)

Это только действительно работало бы, если Ваш Ваш документ HTML отформатирован к стандартам XHTML. Кроме того, Тег основного текста был бы корневым узлом, таким образом, необходимо будет изменить XPath на "/body/div [9] / DIV [2]"

0
ответ дан 16 December 2019 в 21:48
поделиться

jQuery реализует cross-browser-compatible подмножество xPath селекторов с плагином. Ваш пример "/html/body/div [9] / DIV [2]" должен работать в нем.

(редактирование - исправленный благодаря Sergey Ilinsky)

0
ответ дан 16 December 2019 в 21:48
поделиться

Я был бы немного взволнован по поводу использования xml как это, поскольку Вы не можете быть уверены, какую версию (если таковые имеются) DLL XML человек имеет. Существуют все еще компании с помощью IE5.0 там группами, и 5.5 имел особенно скверную реализацию XML.

0
ответ дан 16 December 2019 в 21:48
поделиться

Another JavaScript implementation of W3C Dom Level 3 XPath can be found on Source Forge. But does not appear to be active.

0
ответ дан 16 December 2019 в 21:48
поделиться

Может быть, в IE5 + [1] на самом деле [2] в FF. Microsoft исключительно решила, что нумерация должна начинаться с [0], а не [1], как указано W3C.

3
ответ дан 16 December 2019 в 21:48
поделиться

В коде oly1234 есть некоторые ошибки, которые я пытаюсь исправить следующим образом:

function getXPathElement(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;
}


function findXPathRoot(rootPath,htmlPath,element){
if(rootPath == ""&&htmlPath.toLowerCase() == "html"){
    return element.documentElement;
}
return document.getElementsByTagName(rootPath)[0];
}
function getXPathElementByIndex(decendents, xpathSegment){
//seperate the index from the element name
var temp = xpathSegment.split("[");
var elementName = temp[0];
//get the index as a number eg. "9]" to 9
if(temp[1]){
    var elementIndex = temp[1].replace("]", "");
}else{
    var elementIndex = 1;
}
//the number of matching elements
var count = 0;
for(var i=0;i < decendents.length; i++){
    if (decendents[i].nodeName.toLowerCase() == elementName.toLowerCase()) {
        count++;
        if(count==elementIndex){
            return decendents[i];
        }
    }
}
return null;
}
1
ответ дан 16 December 2019 в 21:48
поделиться

Я не могу найти простое и общее решение, вы можете написать пользовательскую функцию, чтобы реализовать немного xpath, но это трудно получить полный в internet explorer 6 или более низкой версии....

0
ответ дан 16 December 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: