2009-03-16 20 views
6

Chỉnh sửa: Tôi đã bỏ lỡ hai điều ở đây. Việc thiếu "Content-Type: text/xml" trong tiêu đề được trả về bởi cuộc gọi AJAX đã ngăn JQuery xử lý dữ liệu được trả về dưới dạng tài liệu. Khi đã được xử lý chính xác, mã này được phân tích cú pháp chính xác và chỉ xuất ra chỉ mục và tên dự án.Phân tích cú pháp XML bằng CDATA với JQuery

$("a.getprojects").click(function(d){ 
    d.preventDefault(); 
    var api_token = $("#token").val(); 
    var form_fbod = $("#fbod").val(); 
    $.post("fbinfo.php", {fbod: form_fbod, token: api_token, cmd : 'listProjects', extra:''}, function(returned_xml) { 
    var output = ''; 
    $(returned_xml).find("project").each(function(){ 
     var project = $(this); 
     output += project.find("ixProject").text(); 
     output += " "; 
     output += project.find("sProject").text(); 
     output += "\n"; 
    }); 
    $("#output").val(output); 
    }); 
}); 

gốc: Tôi đang gặp vui vẻ bằng cách sử dụng FogBugz API và JQuery để đặt lại với nhau những gì tôi nghĩ sẽ là một công cụ nhỏ mát mẻ, nhưng tôi chạy vào một giới hạn JQuery. Các thẻ CDATA dường như gây nhầm lẫn.

Dưới đây là đoạn code tôi đang sử dụng:

$("a.getprojects").click(function(d){ 
    d.preventDefault(); 
    var api_token = $("#token").val(); 
    var form_fbod = $("#fbod").val(); 
    $.post("fbinfo.php", {fbod: form_fbod, token: api_token, cmd : 'listProjects', extra:''}, function(xml) { 
     var output = xml; 
     $(xml).find("project").each(function(){ 
     var project = $(this); 
     output += "\n\n"; 

     output += project.html(); 

     }); 
     $("#output").val(output); 

    }); 
    }); 

Và đây là kết quả tôi nhận được:

<?xml version="1.0" encoding="UTF-8"?><response> 
    <projects> 
<project> 
<ixProject>2</ixProject> 
<sProject><![CDATA[Inbox]]></sProject> 
<ixPersonOwner>2</ixPersonOwner> 
<sPersonOwner><![CDATA[Rich]]></sPersonOwner> 
<sEmail><![CDATA[[email protected]]]></sEmail> 
<sPhone></sPhone> 
<fInbox>true</fInbox> 
<ixGroup>1</ixGroup> 
<iType>1</iType> 
<sGroup><![CDATA[Internal]]></sGroup> 
</project> 

<project> 
<ixProject>1</ixProject> 
<sProject><![CDATA[Sample Project]]></sProject> 
<ixPersonOwner>2</ixPersonOwner> 
<sPersonOwner><![CDATA[Rich]]></sPersonOwner> 
<sEmail><![CDATA[[email protected]]]></sEmail> 
<sPhone></sPhone> 
<fInbox>false</fInbox> 
<ixGroup>1</ixGroup> 
<iType>1</iType> 
<sGroup><![CDATA[Internal]]></sGroup> 
</project> 
</projects> 
</response> 

<ixproject>2</ixproject> 
<sproject></sproject> 
<ixpersonowner>2</ixpersonowner> 
<spersonowner></spersonowner> 
<semail></semail> 
<sphone></sphone> 
<finbox>true</finbox> 
<ixgroup>1</ixgroup> 
<itype>1</itype> 
<sgroup></sgroup> 

<ixproject>1</ixproject> 
<sproject></sproject> 
<ixpersonowner>2</ixpersonowner> 
<spersonowner></spersonowner> 
<semail></semail> 
<sphone></sphone> 
<finbox>false</finbox> 
<ixgroup>1</ixgroup> 
<itype>1</itype> 
<sgroup></sgroup> 

Có vẻ như rằng phân tích cú pháp XML đó là có nguồn gốc từ JQuery loại bỏ các nội dung của Các phần tử CDATA. FogBugz đặt hầu hết dữ liệu chuỗi của chúng tôi trong các thẻ CDATA vì chúng tôi cho phép các ký tự đặc biệt và dấu câu ở hầu hết các địa điểm. Việc đưa đầu ra vào các thẻ CDATA cho phép chúng ta yên tâm tương đối rằng chúng tôi đang gửi lại dữ liệu hợp lệ qua API của chúng tôi. Phân tích cú pháp PHP của XML hoạt động tốt. Nghiên cứu trực tuyến của tôi mang lại một vài người phàn nàn về điều này, nhưng không có nhiều việc phải làm. Với khả năng mở rộng của JQuery, tôi nghĩ rằng có điều gì đó ngoài kia. Có ai khác hoàn thành việc này không?

Trả lời

14

Có vẻ như rằng phân tích cú pháp XML đó là có nguồn gốc từ JQuery

Không có XML phân tích nguồn gốc từ jQuery. Nó chỉ sử dụng thuộc tính XMLHttpRequest.responseXML tiêu chuẩn để nhận một DOM XML cho phản hồi.

loại bỏ các nội dung của các yếu tố CDATA

gì Content-Type bạn đang gửi câu trả lời với? Bởi vì tôi nghi ngờ nó không được phân tích cú pháp như XML. Trong trường hợp này jQuery sẽ chuyển bạn trở lại một chuỗi tài liệu, thay vì một DOM XML.

Sau đó, khi bạn gọi “$ (xml)”, nó sẽ tạo nội dung tài liệu từ chuỗi đó (*) - được phân tích cú pháp dưới dạng HTML, không phải XML. Trong HTML, không có phần nào như phần CDATA, do đó các trình duyệt có thể loại bỏ chúng hoặc coi chúng là nhận xét.

Tôi nghi ngờ điều này vì “project.html()” không nên thực sự hoạt động khi tài liệu là XML. ‘Html()’ chỉ trả lại giống với thuộc tính ‘innerHTML’ chuẩn (**) chuẩn, chỉ hoạt động đối với tài liệu HTML; nó không được xác định trên các phần tử XML.

Kèm đầu ra trong thẻ CDATA cho phép chúng tôi yên tâm tương đối rằng chúng tôi đang gửi lại dữ liệu hợp lệ qua API của chúng tôi.

Vâng, ‘tương đối’: nếu dữ liệu của bạn có chứa “]]>” bạn vẫn bị mất. <! [CDATA [phần được thiết kế như một cái nạng để cải thiện khả năng viết tay cho tác giả viết tay; XML do máy tạo ra thực sự chỉ nên sử dụng mã hóa thực thể theo cách thông thường. Thông thường, ứng dụng máy chủ nên sử dụng các công cụ XML thích hợp để tạo ra phản hồi trong trường hợp này sẽ được thực hiện tự động.

(*: Tôi chưa bao giờ hiểu được khi nào jQuery cảm thấy cần phải tạo tài liệu cho việc tạo tài liệu và chọn CSS thành cùng một chức năng. Chúng hoạt động hoàn toàn khác nhau mà bạn không muốn bị nhầm lẫn, như có thể đã xảy ra ở đây .)

(**: Thực ra, trước tiên nó sẽ lọc ra các thuộc tính tùy chỉnh jQuery, sử dụng regex. Thật không may vì regex không thể phân tích cú pháp HTML, nó sẽ lọc ra các phần hợp lệ của văn bản. Rất tiếc. Không phải một trong những phần đẹp hơn của jQuery.)

+1

Mọi thứ đã thay đổi, vui lòng cập nhật câu trả lời của bạn. http://api.jquery.com/jQuery.parseXML/ – CharlesTWall3