2012-11-13 45 views
5

我們有一個XML文件,其中某些節點是命名空間的。基本上,文件看起來像這樣:使用jQuery通過命名空間查找XML節點

<foo> 
    <bar xmlns:x="http://www.example.com/"> 
     <x:bla foo="bar" /> 
    </bar> 
</foo> 

我們要實現的是什麼,我們要選擇的x:bla節點,但遺憾的是我們並沒有提前節點的名字知道的,只是它的命名空間。因此,我們所知道的基本上是它是一個x:*節點。

現在,問題是:我們如何使用jQuery的find方法選擇此節點,一旦我們使用$.parseXML解析了XML文件?

使用$(xml).find("x\\:bla, bla")的作品,但只有當我知道該節點被稱爲bla

+0

你可以找到一個可能的解決方案[這裏](http://stackoverflow.com/questions/2563101/how-to-find-extract-data-from-xml-with-jquery) – VicoMan

+0

謝謝提示,但這不是關於命名空間(或者我錯過了什麼?)。 –

+1

也許這將有助於: [鏈接](http://stackoverflow.com/questions/853740/jquery-xml-parsing-with-namespaces) [1]:http://stackoverflow.com/questions/ 853740/jquery-xml-parsing-with-namespaces – Oliver

回答

5

可以使用屬性包含jQuery的選擇(見here

xml.find("[nodeName*='x:']") 
+0

謝謝,完美的作品:-) –

+3

不,它不。它忽略了一切XML的命名空間...... XML片段的創建者可能隨時更改本地前綴,這將破壞您的實現......即使只是升級其工具(可能會在幕後使用某種序列化),也可能會中斷你的應用程序... – Ingo

+0

嗯......是的,這基本上是真實的,但是還有什麼其他解決方案(至少在我現在正在處理的場景中,我並不在乎這些絕對存在但微妙的區別名稱空間和用於該名稱空間的本地前綴,因此沒關係)? –

1

.parseXML()給我XML解析錯誤,看起來它不能處理<x:bla..語法。

所以我只是用jQuery的使用自定義選擇通過命名空間找到的元素:

$.expr[':'].findNS = function(obj, idx, meta, stack) { 
    if (obj.nodeName.indexOf(meta[3].toUpperCase()+':') === 0) { 
     return true; 
    } 
    return false; 
}; 

var xml="<foo><bar><x:bla atr='attvalue' /></bar></foo>"; 

alert($(xml).find(':findNS(x)').attr('atr')); // Alerts 'attvalue' 

見工作demo

+0

我錯過了xmlns-namespace的定義,只是更新了它。 –

1

jQuery XML parsing with namespaces展示瞭如何搜索文字命名空間前綴。我認爲這是一種「邪惡」的解決方法,因爲它不是真正的XML處理。但它看起來像jQuery不支持任何真正的命名空間處理。所以你可能必須去解決這個問題。

0

我也有類似的需求,並希望妥善處理命名空間。這是一個適合我的例子。在這種情況下,我正在閱讀包含MediaRSS屬性的RSS提要。

var xmlDoc = $.parseXML(data); 
var $xml = $(xmlDoc); 
var ns = {}; 
$xml.find('item').each(function() { 
    console.log('title = ' + $(this).find('title').text()); 
    console.log('link = ' + $(this).find('link').text()); 
    console.log('thumb = ' + 
     $(this.getElementsByTagNameNS('http://search.yahoo.com/mrss','thumbnail')).attr('src')); 
});