2008-10-07 26 views
6

Tôi đang cố gắng để chọn một phần tử HTML cụ thể trong tài liệu, cho firefox tôi chỉ sử dụng:kết quả khác nhau lựa chọn các phần tử HTML với XPath trong Firefox và Internet Explorer

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

mà hoạt động tốt. Tuy nhiên, khi tôi dùng thử IE tương đương:

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

Tôi không nhận được đối tượng nào được trả lại. Vì vậy, câu hỏi của tôi là có một cách dễ dàng để sử dụng XPath để có được các yếu tố tôi muốn trong IE? XPath tôi đang sử dụng trông giống như

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

Trả lời

0

Bạn có chắc chắn X-Path được triển khai trong phiên bản Internet Explorer của bạn không? Như trong: bạn đang sử dụng phiên bản nào?

3

Hãy xem dự án http://dev.abiss.gr/sarissa/. Họ đã di chuyển hầu hết các API liên quan đến XML sang IE. Nếu không, nó thực sự cũng dễ thực hiện. Các vấn đề bạn cần giải quyết sẽ là: tuần tự hóa HTML thành XML hợp lệ, đồng bộ hóa kết quả của truy vấn XPath XMLDOM với HTMLDOM gốc. Theo hiểu biết của tôi, họ đã thực hiện nó trong thư viện của họ, tuy nhiên, hiệu suất của nó có thể tốt hơn.

0

Thực hiện jQuery a cross-browser-compatible subset of xPath selectors with a plug-in. Ví dụ "/ HTML/BODY/DIV [9]/DIV [2]" của bạn nên hoạt động trong đó.

(chỉnh sửa - sửa nhờ Sergey Ilinsky)

+4

jQuery KHÔNG thực thi XPath. Nó thực hiện một tính năng chọn đường dẫn rất đơn giản (khoảng ~ 0,01% XPath) –

0

Thay vì làm

xmlDoc.load(document); 

thử

xmlDoc.loadXML(document.body.outerHTML) 

này sẽ chỉ thực sự có tác dụng nếu tài liệu HTML của bạn của bạn được định dạng tiêu chuẩn XHTML . Ngoài ra, thẻ BODY sẽ là nút gốc, vì vậy bạn sẽ phải thay đổi XPATH thành "/ BODY/DIV [9]/DIV [2]"

0

Tôi sẽ hơi lo lắng về việc sử dụng xml như thế này , vì bạn không thể chắc chắn phiên bản (nếu có) của XML DLL mà một người có. Hiện vẫn còn các công ty sử dụng IE5.0 trên các ổ đĩa, và 5.5 đã có một triển khai XML đặc biệt ropey.

1

Hi tốt cuối cùng tôi đã đưa ra giải pháp tinh ranh của riêng tôi, bất kỳ sugestions về việc cải thiện nó sẽ được rất nhiều apreciated. Nó làm cho sử dụng một số chức năng nguyên mẫu:

trình trong IE5 + với xpath dạng "/ HTML/BODY/DIV [9]/DIV [2]"

chức năng getXPathElement (xpath, phần tử) {

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

}

chức năng 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; 

}

Nhờ tất cả mọi người vì sự trợ giúp của họ, dù bằng cách nào tôi cũng đã học được một chút công bằng về các khuôn khổ javascript khác nhau.

3

Vấn đề có thể là trong IE5 + [1] là trong thực tế [2] trong FF. Microsoft chỉ quyết định rằng việc đánh số sẽ bắt đầu tại [0] chứ không phải [1] theo quy định của w3c.

0

tôi không thể tìm thấy một giải pháp đơn giản và phổ biến, bạn có thể viết tùy chỉnh chức năng để thực hiện một ít xpath nhưng thật khó để có được trọn vẹn trong internet explorer 6 hoặc phiên bản thấp hơn ....

1

Có một số lỗi trong mã của oly1234 Tôi cố sửa nó như sau:

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; 
} 
Các vấn đề liên quan