6

ドキュメント内の特定の HTML 要素を選択しようとしています。

xpathobj = document.evaluate(xpath, document, null,
               XPathResult.FIRST_ORDERED_NODE_TYPE, null);

これは正常に動作します。ただし、同等の IE を試すと、次のようになります。

xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.load(document);
xmlDoc.setProperty("SelectionLanguage", "XPath");
xpathobj = xmlDoc.selectNodes(xpath);

オブジェクトが返されません。私の質問は、IE で必要な要素に到達するために XPath を使用する簡単な方法はありますか? 私が使用しているXPathは次のようになります

/HTML/BODY/DIV[9]/DIV[2]
4

10 に答える 10

3

http://dev.abiss.gr/sarissa/プロジェクトをご覧ください。彼らは、XML 関連の API のほとんどを IE に移行しました。そうでなければ、実際に実装するのも簡単です。解決する必要がある問題は、HTML を有効な XML にシリアル化すること、XMLDOM XPath クエリの結果を元の HTMLDOM と同期することです。私の知る限り、彼らはライブラリでそれを行いましたが、そのパフォーマンスはもっと良かったかもしれません.

于 2008-10-07T11:31:49.257 に答える
3

問題は、IE5+ では [1] が実際には FF の [2] である可能性があります。Microsoft は、w3c で指定されている [1] ではなく、[0] から番号付けを開始することを単独で決定しました。

于 2010-02-02T11:34:10.263 に答える
1

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;
}
于 2010-07-20T03:50:54.373 に答える
1

こんにちは、最終的に私は自分自身の危険な解決策を思いつきました。それを改善するための提案は非常に高く評価されます。いくつかのプロトタイプ機能を利用します。

「/HTML/BODY/DIV[9]/DIV[2]」の形式の xpath を使用して IE5+ で動作します。

function 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++;
}

}

function getXPathElementByIndex(decendents, 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 フレームワークについてかなりのことを学びました。

于 2008-10-08T12:25:24.687 に答える
0

jQueryは、プラグインを使用して、ブラウザー間で互換性のあるxPathセレクターのサブセットを実装します。例「/HTML/ BODY / DIV [9] /DIV[2]」がその中で機能するはずです。

(編集-Sergey Ilinskyのおかげで修正されました)

于 2008-10-07T11:58:36.987 に答える
0

W3C Dom Level 3 XPathの別の JavaScript 実装は、Source Forge にあります。しかし、活動しているようには見えません。

于 2009-05-01T11:13:57.357 に答える
0

私は単純で一般的な解決策を見つけることができません.xpathを少し実装するカスタム関数を書くことができます.

于 2010-07-20T02:36:02.230 に答える
0

する代わりに

xmlDoc.load(document); 

試す

xmlDoc.loadXML(document.body.outerHTML)

これは、HTML ドキュメントが XHTML 標準にフォーマットされている場合にのみ機能します。また、BODY タグはルート ノードになるため、XPATH を「/BODY/DIV[9]/DIV[2]」に変更する必要があります。

于 2008-10-08T07:41:58.190 に答える
0

お使いのバージョンの Internet Explorer に X-Path が実装されていますか? のように: どのバージョンを使用していますか?

于 2008-10-07T11:26:31.153 に答える
0

人が持っている XML DLL のバージョン (存在する場合) がわからないため、このような xml の使用については少し心配です。いまだに IE5.0 を大量に使用している企業があり、5.5 には特に厄介な XML 実装がありました。

于 2008-10-08T08:55:49.990 に答える