2009-08-17 3 views
20

Saw ví dụ này trên trang ví dụ jQuery cho Ajax:Chuyển đổi String để tài liệu XML trong JavaScript

var xmlDocument = [create xml document]; 
$.ajax({ 
     url: "page.php", 
     processData: false, 
     data: xmlDocument, 
     success: someFunction 
    }); 

Làm thế nào để tham gia một chuỗi như:

var t = '<foo><bar>something</bar></foo>'; 

Và chuyển đổi đó để một DOM XML vật? Qua trình duyệt?

CẬP NHẬT: Vui lòng xem nhận xét về câu trả lời của karim79.

Trả lời

35

Bọc trong đối tượng jQuery. Sau đó sử dụng các phương thức thao tác DOM bình thường của jQuery trên đó.

var t = $('<foo><bar>something</bar></foo>'); 

//loop over 'bar' nodes 
t.find('bar').each(function() { 
    alert($(this).text()); 
}); 

Nếu bạn muốn chuyển đổi nó trở lại thành một chuỗi đơn giản (sau khi sửa đổi nó chẳng hạn) bạn có thể làm điều đó như vậy:

//then convert it back to a string 
//for IE 
if (window.ActiveXObject) { 
    var str = t.xml; 
    alert(str); 
} 
// code for Mozilla, Firefox, Opera, etc. 
else { 
    var str = (new XMLSerializer()).serializeToString(t); 
    alert(str); 
} 

EDIT: Các $.ajax manual says (vào tùy chọn processData):

theo mặc định, dữ liệu được truyền vào dữ liệu lựa chọn như một đối tượng (về mặt kỹ thuật, bất cứ điều gì khác hơn là một string) sẽ được xử lý và được chuyển thành truy vấn chuỗi, phù hợp với mặc định loại nội dung "ứng dụng/x-www-form-urlencoded". Nếu bạn muốn gửi DOMDocuments hoặc dữ liệu không được xử lý khác, hãy đặt tùy chọn này thành sai.

Vì vậy, nếu bạn đang đi qua một đối tượng jQuery đến máy chủ, bạn sẽ cần phải thiết lập đó để đúng hoặc loại bỏ nó hoàn toàn (nó được thiết lập để đúng theo mặc định). Hy vọng đã giúp.

+0

Có thể tôi đang gặp lỗi trong cuộc gọi $ .ajax. Tôi đã quấn nó như bạn đã nói. Sau đó, đăng nhập của tôi trên máy chủ cho thấy tôi đang đi qua: [đối tượng Object] Tôi nên thử gì bây giờ? – BuddyJoe

+0

Tôi có làm gì sai với .ajax() không? Tôi chỉ truyền nó như một chuỗi và nó hoạt động. kỳ dị. Điều này có liên quan đến tùy chọn processData không? hoặc một tùy chọn khác mà tôi không bật? – BuddyJoe

+0

+1 cảm ơn những ví dụ này – BuddyJoe

10

Chỉ cần báo trước khi gọi điện thoại - nếu đó là phần tử cấp cao nhất bạn cần sử dụng bộ lọc thay thế.

var t = $('<foo><bar>something</bar></foo>'); 

//loop over 'foo' nodes 
t.filter('foo').each(function() { 
    alert($(this).find('bar').text()); 
}); 
+0

@pubb - bạn nói đúng, tôi bỏ qua chi tiết đó vì tôi luôn lặp qua các phần tử cấp hai. +1 để chỉ ra. – karim79

0

bạn có thể sử dụng mã này đơn giản để chuyển đổi thẻ xml của bạn vào văn bản đang rắn

var temp_var = $("<p/>").append($(your_xml_data)).htML() 
0

rock. hoạt động hoàn hảo trong tất cả các trình duyệt.

var xmlFields = $("<root><reports name='report 1'><item 
       field='ord_num' desc='Order Number'/></reports></root>"); 
alert(xmlFields[0].outerHTML); 
+0

Điều này chỉ hoạt động vì jQuery đã tạo ra các nút HTML cho những điều này. Đối với một cái gì đó mà jQuery đang xử lý chúng như các nút XML (như '$ ($. ParseXML (" "), điều này sẽ không hoạt động. – ZiggyTheHamster

0

Bạn có thể thực hiện chuyển đổi mà không cần jQuery. Điều này được lấy từ số DOMParser Documentation của Mozilla:

// Create a DOMParser 
var parser = new DOMParser(); 

// Use it to turn your xmlString into an XMLDocument 
var xmlDoc = parser.parseFromString(xmlString, "application/xml");