2011-04-07 102 views
0

我有越來越的XPath返回任何東西的問題。我只在Firefox中嘗試過,但我已經使用了一堆不同的示例,但它們都沒有工作。的XPath評估()沒有返回任何

function populateFilters(productType) { 
callAjax.request({ 
    url: './Products.xml', 
    onSuccess: function(rootNode, fullText) { 
     var path = '//product'; 
     // code for IE 
     if (window.ActiveXObject) 
      var nodes=rootNode.selectNodes(path); 
     // code for Mozilla, Firefox, Opera, etc. 
     else if (document.implementation && document.implementation.createDocument) 
      var nodes=rootNode.evaluate(path, rootNode, null, 0, null); 

     for (var i = 0; i < nodes.length; ++i) { 
      nodes[i].childNodes[0]; 
     } 
    }, 
    onError: function(errCode, responseStatus) {alert('An error has occured. Please contact the site\'s Webmaster.\n\n' + errCode + '\n' + responseStatus);} 
    }); 
} 

ajax調用工作正常......我得到的XML文檔,並能夠瀏覽DOM沒有問題。我遇到的問題是,當代碼擊中rootNode.evaluate()電話,什麼都不會返回。沒有錯誤,也沒有數據。下面是XML的一個例子片段:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<root> 
    <product> 
     <type>Snowboard</type> 
     <brand>DC</brand> 
    </product> 
    <product> 
     <type>Skateboard</type> 
     <brand>Banana</brand> 
    </product> 
    <product> 
     <type>Clothing</type> 
     <brand>BoardDokter</brand> 
    </product> 
</root> 

我能想到的唯一的事情是,var path = '//product';是不正確的,但我看過很多例子,它真的應該工作。

任何人有任何想法?火狐4在Windows XP中,並在Windows 7

+2

我懷疑XML源的「榜樣摘錄」。你確定它沒有任何命名空間嗎?這個問題最常見的原因是人們沒有意識到命名空間的重要性,所以他們將它們從他們發佈的源XML中移除。 – 2011-04-07 22:20:28

+0

沒有。這個系統只是我快速爲朋友做的事情,所以他可以填充他的網頁,直到他可以獲得數據庫。沒有名稱空間。您在代碼片段中看到的內容實際上是從實際文檔複製/粘貼的。爲了長度的原因,我刪除了一些產品,但這只是關於它。 – Sivvy 2011-04-08 00:21:47

回答

3

document.evaluate返回一個XPathResult對象,其有用的方法取決於參數:

  • 無序(4)和排序(5)迭代器給你iterateNext()對象,它返回每個節點,然後返回null
  • 無序(6)和有序(7)快照爲您提供snapshotLengthsnapshotItem(index)的對象。如果你的XPath表達式返回節點
  • 任何(0)會給你一個無序迭代器。

由於評估的第四個參數是0,它給了你一個無序的迭代器,你必須調用iterateNext()。這可能不是你想要的(大多數人想要一個有保證的訂單)。

Mozilla documentation on document.evaluateW3C reference on document.evaluate瞭解更多詳情。

var xml = '<?xml version="1.0" encoding="ISO-8859-1"?>\n' + 
    '<root>\n' + 
    ' <product>\n' + 
    '  <type>Snowboard</type>\n' + 
    '  <brand>DC</brand>\n' + 
    ' </product>\n' + 
    ' <product>\n' + 
    '  <type>Skateboard</type>\n' + 
    '  <brand>Banana</brand>\n' + 
    ' </product>\n' + 
    ' <product>\n' + 
    '  <type>Clothing</type>\n' + 
    '  <brand>BoardDokter</brand>\n' + 
    ' </product>\n' + 
    '</root>'; 
var path = '//product'; 
var doc = (new DOMParser).parseFromString(xml, 'text/xml'); 

// choice 1: use iterator 
var it = doc.evaluate(path, doc, null, 5, null); 
var nodes1 = []; 
var node; 
while (node = it.iterateNext()) {nodes1.push(node);} 

// choice 2: use snapshot 
var snapshot = doc.evaluate(path, doc, null, 7, null); 
var nodes2 = []; 
for (var i = 0; i < snapshot.snapshotLength; i++) { 
    nodes2.push(snapshot.snapshotItem(i)); 
} 

方便的技巧:類型$x到在Chrome瀏覽你的Javascript控制檯,查看其功能的源轉的XPath成Javascript數組。

+0

當然,你的回答是正確的,但它以不同的原因回答了我的問題。所有我試過的東西,我從來沒有試圖改變0到7出於某種原因,「ANY_TYPE」返回絕對沒問題,而快照可以正常使用。 Firebug從字面上表明節點的價值每次都是「[」。 – Sivvy 2011-04-08 00:09:40