2010-11-26 41 views
1

我有下面的代碼在那裏我試圖讓C:CreationDate節點:的Javascript的XML解析器:如何獲取具有節點「:」在名稱

value = '<?xml version="1.0" encoding="UTF-8"?><content><c:CreationDate>2010-09-04T05:04:53Z</c:CreationDate></content>'; 

xml = (new DOMParser()).parseFromString(value, 'text/xml'); 

console.log(xml.getElementsByTagName('c:CreationDate')); 

不幸的是它返回一個空數組,而不是使用xml中的節點的數組。我認爲這是由於「:」符號引起的。

有沒有辦法逃脫它?

注意:請不要在childNodes或類似的東西上建議使用。這對我來說不起作用,因爲我的xml驗證複雜(這裏僅僅是一個示例),將來很可能會改變,我只能依賴標籤名稱。

謝謝!

回答

10

c in c:CreationDate表示XML namespace前綴。命名空間前綴只是命名空間的快捷方式。命名空間必須在文檔中的某個地方用xmlns:c屬性定義。但是在你的文檔中缺少名稱空間定義。

因此,它應該是這樣的:

var value = '<?xml version="1.0" encoding="UTF-8"?>' + 
      '<content>' + 
      ' <c:CreationDate xmlns:c="http://my.namespace">2010-09-04T05:04:53Z</c:CreationDate>' + 
      '</content>'; 

var value = '<?xml version="1.0" encoding="UTF-8"?>' + 
      '<content xmlns:c="http://my.namespace">' + 
      ' <c:CreationDate>2010-09-04T05:04:53Z</c:CreationDate>' + 
      '</content>'; 

在這個例子中,前綴c被分配到命名空間http://my.namespaceCreationDate標記的前綴爲c,因此它屬於命名空間http://my.namespace

然後你可以使用的名稱空間感知getElementsByTagNameNS()功能來查詢的CreationDate元素:

console.log(xml.getElementsByTagNameNS('http://my.namespace', 'CreationDate')); 

至於你必須通過真正的命名空間的名稱,而不是前綴的第一個參數。

相關問題