Question

Modifier: Il me manquait deux choses ici. Le manque de & Quot; Content-Type: text / xml & Quot; dans l’en-tête renvoyé par l’appel AJAX empêchait JQuery de traiter les données renvoyées comme un document. Une fois que cela a été géré correctement, ce code a été analysé correctement et ne contient que l’index et le nom du projet.

$("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 : je m'amuse à utiliser le API FogBugz et JQuery pour mettre en place ce qui, à mon avis, sera un petit outil intéressant, mais je suis confronté à une limitation de JQuery. Les balises CDATA semblent l’embrouiller.

Voici le code que j'utilise:

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

    });
  });

Et voici le résultat obtenu:

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

Il semblerait que l'analyse XML native de JQuery ignore le contenu des éléments CDATA. FogBugz place la plupart de nos données de chaîne dans les balises CDATA, car nous autorisons les caractères spéciaux et la ponctuation dans la plupart des endroits. Enfermer la sortie dans des balises CDATA nous permet de nous assurer que nous renvoyons des données valides via notre API. L'analyse PHP du XML fonctionne très bien. Mes recherches en ligne ont permis à quelques personnes de se plaindre à ce sujet, mais le travail à accomplir était limité. Avec l'extensibilité de JQuery, je penserais qu'il y a quelque chose dehors. Quelqu'un d'autre a-t-il accompli cela?

Était-ce utile?

La solution

  

Il semblerait que l'analyse XML native de JQuery

Il n’existe pas d’analyse XML native pour jQuery. Il utilise simplement la propriété XMLHttpRequest.responseXML standard pour obtenir un DOM XML pour la réponse.

  

ignore le contenu des éléments CDATA

Avec quel type de contenu envoyez-vous la réponse? Parce que je soupçonne que ce n'est pas du tout analysé en XML. Dans ce cas, jQuery vous renverra une chaîne du document au lieu d’un DOM XML.

Ensuite, lorsque vous appelez & # 8220; $ (xml) & # 8221 ;, le contenu du document sera créé à partir de cette chaîne (*) & # 8201; & # 8212; # 8201; analysé au format HTML, pas XML. En HTML, il n’existe pas de section CDATA. Les navigateurs peuvent donc les supprimer ou les traiter comme des commentaires.

Je le soupçonne parce que & # 8220; project.html () & # 8221; ne devrait pas fonctionner lorsque le document est au format XML. & # 8216; html () & # 8217; retourne simplement la même chose que le standard & # 8216; innerHTML & # 8217; property (**), qui ne fonctionne que pour les documents HTML; il n'est pas défini sur les éléments XML.

  

Le fait de placer les balises CDATA dans la sortie nous permet de nous assurer que nous renvoyons des données valides via notre API.

Eh bien, & # 8216; relativement & # 8217;: si vos données contiennent & # 8220;]] > & # 8221; tu perds encore. <! [CDATA [les sections sont conçues comme une béquille pour améliorer l'écriture pour la création manuelle; le XML généré par machine ne devrait en réalité utiliser que le codage d'entité de la manière habituelle. Généralement, l’application serveur doit utiliser les outils XML appropriés pour générer la réponse, auquel cas cela se fera automatiquement.

(*: Je n'ai jamais compris quand jQuery a ressenti le besoin de regrouper la création de fragments de document et la sélection CSS dans la même fonction. Ce sont des opérations complètement différentes qu'il ne faut pas confondre, comme cela pourrait être arrivé ici. )

(**: En fait, il essaie d'abord de filtrer les attributs personnalisés jQuery, en utilisant une expression rationnelle. Malheureusement, étant donné que regex ne peut pas analyser le code HTML, il filtrera volontiers les parties valides de votre texte qui ressemblent à des attributs HTML. Pas une des plus jolies parties de jQuery.)

Autres conseils

jquery a en fait un analyseur XML qui devrait maintenant résoudre votre problème.     $ .parseXML (xml) http://api.jquery.com/jQuery.parseXML/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top