2009-03-16 11 views
6

Edit: Ich habe zwei Dinge hier fehlen. Das Fehlen von "Content-Type: text/xml" in der vom AJAX-Aufruf zurückgegebenen Kopfzeile verhinderte, dass JQuery die zurückgegebenen Daten als Dokument behandelte. Sobald dies korrekt gehandhabt wurde, wurde dieser Code korrekt analysiert und nur der Index und der Projektname ausgegeben.Parsing XML mit CDATA mit 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); 
    }); 
}); 

Original-: Ich habe Spaß mit der FogBugz API und JQuery zusammen zu fassen, was ich denke, wird ein kühles kleines Werkzeug sein, aber ich bin in eine JQuery Begrenzung läuft. CDATA-Tags scheinen es zu verwirren.

Hier ist der Code, den ich mit:

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

    }); 
    }); 

Und hier ist die Ausgabe erhalte ich:

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

Es scheint, dass die XML-Analyse, die auf JQuery nativen ist verwirft den Inhalt CDATA-Elemente. FogBugz setzt die meisten unserer String-Daten in CDATA-Tags, da wir an den meisten Stellen Sonderzeichen und Interpunktionszeichen zulassen. Wenn wir die Ausgabe in CDATA-Tags einschließen, können wir relativ sicher sein, dass wir gültige Daten über unsere API zurücksenden. PHP-Parsing der XML funktioniert gut. Meine Online-Recherche bringt ein paar Leute dazu, sich darüber zu beschweren, aber nicht viel Arbeit zu erledigen. Mit der Erweiterbarkeit von JQuery würde ich denken, dass da draußen etwas ist. Hat jemand anderes dies erreicht?

Antwort

14

Es scheint, dass die XML-Analyse, die

Es zu JQuery nativer ist keine XML jQuery Parsen nativer. Es verwendet nur die XMLHttpRequest.responseXML-Standardeigenschaft, um ein XML-DOM für die Antwort abzurufen.

verwirft den Inhalt von CDATA Elemente

Welche Content-Type werden Sie die Antwort mit dem Senden? Weil ich vermute, dass es überhaupt nicht als XML geparst wird. In diesem Fall wird jQuery Ihnen anstelle eines XML-DOM eine Zeichenfolge des Dokuments übergeben.

Wenn Sie dann "$ (xml)" aufrufen, wird Dokumentinhalt aus dieser Zeichenfolge (*) erstellt - analysiert als HTML, nicht XML. In HTML gibt es keinen CDATA-Abschnitt, daher können Browser sie verwerfen oder als Kommentare behandeln.

Ich vermute dies, weil "project.html()" eigentlich nicht funktionieren sollte, wenn das Dokument XML ist. 'Html()' gibt genau das gleiche zurück wie die Standard-Eigenschaft 'innerHTML' (**), die nur für HTML-Dokumente funktioniert; es ist auf XML-Elementen nicht definiert.

Wenn wir die Ausgabe in CDATA-Tags einschließen, können wir ziemlich sicher sein, dass wir gültige Daten über unsere API zurücksenden.

Nun, 'relativ': wenn Ihre Daten zufällig enthalten "]]>" Sie immer noch verlieren. <! [CDATA [Abschnitte sind als eine Krücke zur Verbesserung der Schreibbarkeit für Hand-Authoring gedacht; maschinengeneriertes XML sollte die Entitätscodierung in der normalen Weise verwenden. Normalerweise sollte die Server-Anwendung geeignete XML-Tools verwenden, um die Antwort zu generieren. In diesem Fall wird dies automatisch durchgeführt.

(*: Ich habe nie verstanden, wenn jQuery das Bedürfnis verspürt, die Erstellung von Dokumentfragmenten und die CSS-Auswahl in dieselbe Funktion zu zerlegen. Sie sind völlig verschiedene Operationen, die Sie nicht durcheinander bringen wollen .)

(**: Tatsächlich versucht es, jQuery benutzerdefinierte Attribute zuerst mit einer Regex auszufiltern. Leider, da Regex HTML nicht verarbeiten kann, wird es gerne gültige Teile Ihres Textes ausfiltern, die wie HTML-Attribute aussehen "Whoops. Keines von jQuerys schöneren Teilen."

+1

Die Dinge haben sich geändert, bitte aktualisieren Sie Ihre Antwort. http://api.jquery.com/jQuery.parseXML/ – CharlesTWall3