Pergunta

Editar: que estava faltando duas coisas aqui. A falta de "Content-Type: text / xml" no cabeçalho retornado pela chamada AJAX estava impedindo JQuery de tratar os dados retornados como um documento. Uma vez que foi tratada corretamente, este código analisado corretamente e saída apenas o nome do índice e do projeto.

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

Original : Estou me divertindo com o FogBugz API e JQuery para unir o que eu acho que vai ser uma ferramenta legal pouco, mas eu estou correndo em uma limitação JQuery. tags CDATA parecem confundir-lo.

Aqui está o código que estou usando:

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

    });
  });

E aqui está a saída que eu recebo:

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

Parece que a análise do XML que é nativa da JQuery descarta o conteúdo de elementos CDATA. FogBugz coloca a maior parte de nossos dados corda em tags CDATA porque nós permitimos caracteres especiais e pontuação na maioria dos lugares. Encerrando a saída em tags CDATA nos permite descansar relativamente certeza de que estamos enviando dados de volta válidos através da nossa API. PHP análise do XML funciona muito bem. Minha pesquisa on-line produz algumas pessoas reclamando sobre isso, mas não muito trabalho sendo feito. Com extensibilidade do JQuery, eu acho que há algo lá fora. Tem mais alguém conseguiu isso?

Foi útil?

Solução

Parece que a análise do XML que é nativa da JQuery

Não há análise de XML nativo para jQuery. Ele só usa a propriedade XMLHttpRequest.responseXML padrão para obter um DOM XML para a resposta.

descarta o conteúdo de elementos CDATA

O Content-Type que você está enviando a resposta com? Porque eu suspeito que não está a ser analisado como XML em tudo. Neste caso jQuery vai passar a você uma string do documento, em vez de um DOM XML.

Então, quando você chama de “$ (xml)”, será criar o conteúdo do documento a partir desse string (*) - analisado como HTML, não XML. Em HTML não existe tal coisa como uma seção CDATA, então navegadores pode descartá-las ou tratá-los como comentários.

Eu suspeito que isso porque “project.html ()” não deve realmente funcionar quando o documento é XML. ‘Html ()’ retorna apenas o mesmo que a propriedade padrão ‘innerHTML’ (**), que só funciona para documentos HTML; ela é indefinida em elementos XML.

Encerrando a saída em tags CDATA nos permite descansar relativamente certeza de que estamos enviando dados de volta válidos através da nossa API.

Bem, ‘relativamente’: se os seus dados acontece para conter “]]>” você ainda perde.

(*:. Nunca entendi quando jQuery sente a necessidade de criação fragmento do documento squish e seleção CSS para a mesma função Eles são completamente diferentes operações que você não quer ficar confuso, como pode ter acontecido aqui. )

(**: Na verdade, ele tenta filtrar atributos jQuery costume primeiro, usando um regex Infelizmente desde regex HTML não pode analisar, ele terá todo o prazer filtrar partes válidas de seu texto que acontecem para olhar como atributos HTML Whoops... nem uma das peças mais bonitas do jQuery.)

Outras dicas

jquery faz, de facto, um analisador XML agora que deve resolver o seu problema. $ .ParseXML (xml) http://api.jquery.com/jQuery.parseXML/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top