2009-03-16 27 views
6

Редактировать: Мне не хватало двух вещей здесь. Отсутствие «Content-Type: text/xml» в заголовке, возвращаемом вызовом AJAX, мешало JQuery обрабатывать возвращенные данные в качестве документа. Как только это было правильно обработано, этот код правильно разбирался и выводил только имя индекса и проекта.Анализ XML с CDATA с помощью 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); 
    }); 
}); 

Оригинал: Я с удовольствием используя FogBugz API и JQuery, чтобы собрать то, что я думаю, будет немного прохладной инструмент, но я бегу в ограничение JQuery. Похоже, что теги CDATA запутывают его.

Вот код, я использую:

$("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); 

    }); 
    }); 

А вот и выход я получаю:

<?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> 

Казалось бы, что XML синтаксический анализ, что это родной для JQuery сбрасывает содержимое Элементы CDATA. FogBugz помещает большинство наших строковых данных в теги CDATA, потому что мы допускаем специальные символы и знаки препинания в большинстве мест. Закрытие вывода в тегах CDATA позволяет нам относительно уверенно относиться к тому, что мы отправляем действительные данные через наш API. PHP-анализ XML работает отлично. Мое исследование в Интернете дает несколько человек, жалующихся на это, но не так много работы. С расширяемостью JQuery я бы подумал, что есть что-то там. Кто-нибудь еще это сделал?

ответ

14

Казалось бы, что XML синтаксический анализ, что это родной для JQuery

Там нет XML разбора родной для JQuery. Он просто использует стандартное свойство XMLHttpRequest.responseXML, чтобы получить XML DOM для ответа.

сбрасывает содержимое CDATA элементов

Что Content-Type вы посылаете ответ с? Потому что я подозреваю, что он не анализируется как XML вообще. В этом случае jQuery передаст вам строку документа, а не XML DOM.

Затем, когда вы вызываете «$ (xml)», он будет создавать содержимое документа из этой строки (*) - анализируется как HTML, не XML. В HTML нет такой вещи, как раздел CDATA, поэтому браузеры могут их отбросить или рассматривать как комментарии.

Я подозреваю это, потому что «project.html()» на самом деле не работает, когда документ является XML. 'Html()' просто возвращает то же, что и стандартное свойство innerHTML (**), которое работает только для HTML-документов; он не определен в XML-элементах.

Закрытие вывода в тегах CDATA позволяет нам относительно уверенно относиться к тому, что мы отправляем действительные данные через наш API.

Ну, «относительно»: если ваши данные содержат «]]>« вы все равно проигрываете. <! [CDATA [секции предназначены как костыль для улучшения возможности записи для ручного авторинга; машинный XML должен действительно просто использовать сущность-кодирование в обычном режиме. Обычно серверное приложение должно использовать надлежащие инструменты XML для генерации ответа, и в этом случае это будет сделано автоматически.

(*: Я никогда не понимал, когда jQuery чувствует необходимость сжимать создание фрагмента документа и выбор CSS в одну и ту же функцию. Это совершенно разные операции, которые вы не хотите путать, как это могло бы произойти здесь .)

(**: На самом деле, он пытается сначала отфильтровать пользовательские атрибуты jQuery, используя регулярное выражение. К сожалению, поскольку регулярное выражение не может анализировать HTML, оно будет успешно отфильтровывать действительные части вашего текста, которые выглядят как HTML-атрибуты У нас нет ни одного из более красивых деталей jQuery.)

+1

Все изменилось, пожалуйста, обновите свой ответ. http://api.jquery.com/jQuery.parseXML/ – CharlesTWall3