Вопрос

Изменить. Мне здесь не хватало двух вещей. Отсутствие & Quot; Content-Type: text / xml & Quot; в заголовке, возвращаемом вызовом AJAX, было предотвращение обработки возвращенными данными 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[rich@example.com]]></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[rich@example.com]]></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, я думаю, что-то там есть. Кто-нибудь еще достиг этого?

Это было полезно?

Решение

  

Казалось бы, XML-разбор является родным для JQuery

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

  

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

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

Затем, когда вы вызовете & # 8220; $ (xml) & # 8221;, он будет создавать содержимое документа из этой строки (*) & # 8201; & # 8212; # 8201; анализируется как HTML, не XML. В HTML нет такого понятия, как раздел CDATA, поэтому браузеры могут отбрасывать их или рассматривать как комментарии.

Я подозреваю это, потому что & # 8220; project.html () & # 8221; на самом деле не должен работать, когда документ XML. & # 8216; HTML () # 8217 &; просто возвращает то же самое, что и стандартный & # 8216; innerHTML & # 8217; свойство (**), которое работает только для документов HTML; он не определен для элементов XML.

  

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

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

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

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

Другие советы

У jquery теперь есть xml-анализатор, который должен решить вашу проблему.     $ .ParseXML (XML) http://api.jquery.com/jQuery.parseXML/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top