2008-10-07 20 views
6

मैं एक दस्तावेज़ में एक विशिष्ट HTML तत्व का चयन करने के कोशिश कर रहा हूँ फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर में XPath के साथ HTML तत्वों, फ़ायरफ़ॉक्स के लिए मैं सिर्फ का उपयोग का चयन:अलग परिणाम

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

जो ठीक काम करता है। हालांकि जब मैं आईई समतुल्य कोशिश करता हूं:

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

मुझे कोई वस्तु वापस नहीं आती है। तो मेरा सवाल है कि आईई में इच्छित तत्व को प्राप्त करने के लिए XPath का उपयोग करने का एक आसान तरीका है? XPath

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

उत्तर

0

जैसे मैं दिखता उपयोग कर रहा हूँ क्या आप वाकई XPath Internet Explorer के अपने संस्करण में कार्यान्वित किया जाता है? जैसा कि: आप किस संस्करण का उपयोग कर रहे हैं?

3

http://dev.abiss.gr/sarissa/ प्रोजेक्ट पर एक नज़र डालें। उन्होंने अधिकांश एक्सएमएल से संबंधित एपीआई को आईई में माइग्रेट कर दिया है। अन्यथा यह वास्तव में लागू करना भी आसान है। आपको जिन समस्याओं को हल करने की आवश्यकता होगी, वे होंगे: एचटीएमएल का वैध एक्सएमएल में क्रमबद्धता, मूल HTMLDOM के साथ XMLDOM XPath क्वेरी का परिणाम समन्वयित करना। मेरे ज्ञान के लिए उन्होंने इसे अपनी लाइब्रेरी में किया है, हालांकि, इसका प्रदर्शन बेहतर हो सकता था।

0

jQuery a cross-browser-compatible subset of xPath selectors with a plug-in लागू करता है। आपका उदाहरण "/ एचटीएमएल/बॉडी/डीआईवी [9]/डीआईवी [2]" इसमें काम करना चाहिए।

(संपादित करें - ठीक किया सेर्गेई Ilinsky करने के लिए धन्यवाद)

+4

jQuery XPath लागू नहीं करता है। यह एक बहुत ही सरल पथ-चयन सुविधा लागू करता है (जो XPath का ~ 0.01% है) –

0

के बजाय

xmlDoc.load(document); 

करने का प्रयास करें

xmlDoc.loadXML(document.body.outerHTML) 

यह केवल वास्तव में अगर काम करेगा आपके अपने HTML दस्तावेज़ एक्सएचटीएमएल मानकों के फ़ॉर्मेट किया गया है । इसके अलावा, बॉडी टैग रूट नोड होगा, इसलिए आपको अपना XPATH "/ BODY/DIV [9]/DIV [2]"

0

में बदलना होगा, मैं इस तरह xml का उपयोग करने के बारे में थोड़ा चिंतित हूं , क्योंकि आप यह सुनिश्चित नहीं कर सकते कि किसी व्यक्ति के XML DLL का कौन सा संस्करण (यदि कोई है) है। ड्रॉव में आईई 5.0 का उपयोग करने वाली कंपनियां अभी भी हैं, और 5.5 में विशेष रूप से रोपी एक्सएमएल कार्यान्वयन था।

1

हाय अच्छी तरह से अंत में मैं अपने स्वयं के डोडी समाधान के साथ आया, इसे सुधारने पर किसी भी परेशानी की बहुत प्रशंसा होगी।

"/ HTML/शरीर/DIV [9]/DIV [2]"

समारोह getXPathElement (xpath, तत्व) फार्म के xpath साथ IE5 + में काम करता है {

: यह कुछ प्रोटोटाइप कार्यक्षमता का उपयोग करता है
//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 (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; 

}

मेरी सहायता के लिए सभी को धन्यवाद, किसी भी तरह से मैंने विभिन्न जावास्क्रिप्ट ढांचे के बारे में कुछ सीखा।

0

W3C Dom Level 3 XPath का एक अन्य जावास्क्रिप्ट कार्यान्वयन on Source Forge पाया जा सकता है।लेकिन सक्रिय प्रतीत नहीं होता है।

3

समस्या यह हो सकती है कि आईई 5 + [1] वास्तव में एफएफ में [2] है। माइक्रोसॉफ्ट ने पूरी तरह से फैसला किया कि संख्या [0] से शुरू होनी चाहिए और [1] w3c द्वारा निर्दिष्ट नहीं है। कुछ

0

मैं एक सरल और आम समाधान नहीं मिल रहा है, तो आप xpath का एक छोटा लागू करने के लिए कस्टम लिख सकते ढंग से काम करते हैं लेकिन यह इंटरनेट एक्सप्लोरर 6 या उससे पहले संस्करण में पूरा प्राप्त करने के लिए कठिन है ....

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; 
} 
संबंधित मुद्दे