2009-05-20 36 views
4

我想將字符串視爲XML。然後,我將能夠通過jQuery.find與DOM進行查詢。在Firefox中一切正常,但我意識到這不適用於IE。如何通過jQuery中的DOM查詢XML字符串

我這樣做:

var t = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>"; 
    alert("[" + $(t).find("outer").html() + "]"); 

在Firefox 3中它打印:

[<inner>abc</inner><inner>def</inner>] 

在IE 7將打印:

[] 

任何變通辦法讓這對跨越工作瀏覽器?

謝謝。

+0

這是您的真實XML嗎它似乎包含語法錯誤。 – 2009-05-20 19:14:42

+0

Woops。我沒有匹配XML標籤。但這並不重要。問題依然存在。 – Jono 2009-05-20 19:17:28

+0

我在代碼示例中匹配了標籤。現在它更具可讀性。有任何想法嗎? – Jono 2009-05-20 19:26:09

回答

0

這已經有一段時間了,但我只是意識到我忘記了我是如何用你的組合想法解決問題的。

我需要一個完全客戶端數據庫(沒有PHP)。

我創建了一個包含XML的HTML註釋的div。 I parsed the HTML comment with this,然後I converted the XML to JSON with this

var xmltext = $("#piecelist").comments(); 
    var json = $.xml2json(xmltext.html()); 

你可以看到我的方法在這裏的行動: http://wesculpt.net/art.html

也許我應該把這個方法引入一個jQuery插件。

感謝大家的幫助。

1

首先,jQuery構造函數使用HTML而不是XML ......據說,您的XML可能會工作 - 但這取決於很多依賴於瀏覽器的行爲。此外,您還可以通過附加的某處新建的元素,一個隱藏的元素在頁面上,然後試圖查詢它有更好的成功:

var xml = "<books><book><title>Title</title></book></books>"; 
$(xml).appendTo("#hidden"); 
alert($("#hidden books").length); 
+0

嗯。你的想法對我來說有同樣的結果。適用於FF,但不適用於IE。那麼也許我會提到我更大的問題。 我有一個我想查詢爲數據庫的東西的列表。但我想要做到這一切客戶端。這意味着我無法制作.ajax請求。所以我將這個列表作爲XML數據庫隱藏在頁面本身中。在評論裏面,在一個HTML div裏面。有點奇怪,但我找不到另一種方法來維護這張桌子。也許我忽略了一個更簡單的方法? – Jono 2009-05-20 19:58:02

9

有一個2種方法來處理這個。

  1. 轉換XML字符串到DOM,使用這種plugin解析它還是遵循這一tutorial
  2. 使用該plugin轉換XML以JSON。
4

是否有可能將XML存儲爲JSON(我會假設它會)?例如,在PHP中,可以將XML轉換爲數組或對象,然後使用json_encode將其轉換爲JSON。然後,您可以回顯出來像這樣一個javascript變量:

在PHP:

<?php 
$xml = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>"; 
$xml_object = simplexml_load_string(xml); 
$json = json_encode($xml_object); 
?> 
<script language="javascript"> 
$(function() { 
    // eval() is okay to use if you know where the JSON is 
    // coming from (and, of course, you do...) 
    var data = eval('<?php echo $json; ?>'); 
    $(document).data('myapp.data',data); 
}); 
</script> 

而現在,當你需要訪問這些數據,你可以得到它像這樣:

function some_function() { 
    var data = $(document).data('myapp.data'); 
    $.each(data.div.outer,function() { 
     // Would alert 'abc' then 'def' 
     alert(this.inner); 
    }); 
} 

我希望一切都有道理。至少您不必擔心客戶端的XML問題。當然,如果你絕對需要,我發現這對我在過去的工作:

var xml = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>"; 
var $xml = $('<div />').append(xml); 
alert("[" + $xml.find("outer").html() + "]"); 

編輯 我修改代碼以使用您提供實際的XML - 不知道在哪裏我混在那裏(一定是抓住了別人的意外片斷)。你應該給我的第一個建議一個鏡頭 - 它應該工作。

0

在字符串xml中ie ie需要使用.filter,因爲它不想識別xml節點樹。

在ie8中嘗試this,調試器可見以獲取控制檯輸出。

0

那麼怎麼樣,而不是將XML數據集存儲在DOM中,將其轉換爲HTML表並使其不可見。這應該解決jQuery的問題......至少是瀏覽器的具體問題。然後回到工作中來完善你的選擇器。

1

在Javascript中在瀏覽器中硒讀取XML文件:

function loadXMLFromDOM2XMLString(xmlString, xmltag, currentChildNode) { 
var nodes = currentChildNode.childNodes; 
var i = 0 ; 
var node = nodes[i]; 
while (i < nodes.length) { 
    if (node.data == null) {xmltag = '<'+node.localName+'>';} else {xmltag = node.data;}; 
    xmlString = xmlString + xmltag; 
    xmlString = loadXMLFromDOM2XMLString(xmlString, xmltag, node ); 
    if (node.data == null) {xmltag = '<'+'/'+node.localName+'>';} else {xmltag = "";}; 
    xmlString = xmlString + xmltag; 
    i++; 
    node = nodes[i]; 
} 
return xmlString ; 
} ; 
var xmlString = ""; 
var xmltag = ""; 

var currentChildNode = window.document; 

xmlString = loadXMLFromDOM2XMLString(xmlString, xmltag, currentChildNode); 
xmlString; 
3

把XML字符串到一個Javascript變量:

var xmlString = $('<?xml version="1.0"?><Customers><Customer Name="Allan Border" Age="26" ContactNumber="004416165245" Address="Unit # 24 East London" City="London" Country="England"></Customer><Customer Name="Jennifer" Age="28" ContactNumber="004416165248" Address="Unit # 28 West London" City="London" Country="England"></Customer></Customers>'); 

現在,您可以通過每個迭代解析XML的客戶節點:

$(xmlString).find("Customer").each(function() { 
var customerName = $(this).attr("Name"); 
var age = $(this).attr("Age"); 
var contactNumber = $(this).attr("ContactNumber"); 
var address = $(this).attr("Address"); 
var city = $(this).attr("City"); 
var country = $(this).attr("Country"); 
});