2010-11-06 7 views
2

J'ai une liste de citations dans un document XML. Chaque citation est enveloppé comme ceci:Problème XML étrange de jQuery

<Item> 
    <Quote>This is a quote!</Quote> 
    <Source>-- this is the Source of the Quote!</Source> 
</Item> 

Voici le jQuery:

var html = ''; 
    var tmpl = '<li class=""><p class="quote">__quote</p><p class="source">__source</p></li>'; 

    $(quoteObj).find('Item').each(function(){ 

     $that = $(this); 

     var _quote = $that.children('Quote').text(); 
     var _source = $that.children('Source').text(); 

     var qhtml = tmpl.replace('__quote', _quote).replace('__source', _source); 

     html += qhtml; 

    }); 

    return html; 

Dans le produit final, le QUOTES sont tous là, mais le SOURCES ne sont pas. Je ne peux pas pour la vie de moi comprendre pourquoi. Qu'est-ce qui est devant moi que je ne peux pas voir?

INFORMATIONS COMPLÉMENTAIRES POUR RÉPONDRE COMMENTAIRES:

  1. Le XML est correctement formé, et je l'ai changé ci-dessus.
  2. J'ai ajouté la ligne var tmpl pour montrer ce que je remplace dans la boucle. Le __quote est remplacé, et le __source est au moins en cours d'exécution, puisque le second <p> est vide, au lieu de contenir une chaîne.
  3. J'ai vérifié le XML réel revenant de l'appel AJAX, et tout est là, comme il se doit.

Il me semble que c'est une sorte de problème avec la portée et this, ou l'action de la méthode .children(), mais je ne peux toujours pas le trouver.

DERNIER NOTE:

Changé le cas de balise XML Initial Caps, qui est dans le document en question.

+2

Pourriez-vous publier le code XML réel? Votre échantillon n'est pas bien formé (ce qui pourrait être la réponse à votre question, ou pourrait simplement être un raccourci que vous avez pris pour nous montrer quelque chose rapidement) –

+0

Avez-vous les valeurs dans le xml pour Source. il devrait être vérifier avant, juste frapper le point de rupture dans le feu, mais vous pouvez facilement vérifier cela. – kobe

+0

@hollenback, juste plus d'infos, vérifiez si vous obtenez des résultats du backend via le panneau .net si vous obtenez des résultats, puis ajoutez un point d'arrêt dans la boucle et vérifiez les valeurs. – kobe

Répondre

1

juste essayé et la seule chose que je devais changer était la ligne find pour correspondre au cas du noeud XML, par exemple

$(quoteObj).find('ITEM').each(function() { 

Je ne aussi changer la ligne d'affectation $that pour inclure le mot-clé var, mais cela fonctionnait avant que je le fasse

var $that = $(this); 
+0

Étaient-ce les seuls changements que vous avez faits? Parce que ça ne marche pas avec ces changements pour moi. Pourriez-vous tester avec le jQuery sur google et voir quel résultat vous obtenez? Lien vers le fichier jQuery de google: Zabba

+0

C'est exactement ce que j'utilise – Phil

+0

Super bizarre. Je me demande pourquoi je peux le faire fonctionner avec vos changements? Vous voulez poster l'exemple complet? – Zabba

3

jQuery n'analyse pas XML. Passer une chaîne XML à $() affecte simplement la chaîne comme la propriété innerHTML d'un élément, qui a des résultats variables et imprévisibles. Vous devez analyser vous-même le code XML à l'aide de l'analyseur XML intégré au navigateur, puis transmettre le document résultant à jQuery:

var parseXml; 

if (window.DOMParser) { 
    parseXml = function(xmlStr) { 
     return (new window.DOMParser()).parseFromString(xmlStr, "text/xml"); 
    }; 
} else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) { 
    parseXml = function(xmlStr) { 
     var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); 
     xmlDoc.async = "false"; 
     xmlDoc.loadXML(xmlStr); 
     return xmlDoc; 
    }; 
} else { 
    parseXml = function() { return null; } 
} 


var xmlStr = "<Item><Quote>This is a quote!</Quote><Source>-- this is the Source of the Quote!</Source></Item>"; 

var xmlDoc = parseXml(xmlStr); 
$xml = $(xmlDoc); 

$xml.find('Item').each(function() { 
    // Do stuff with each item here 
    alert("Item"); 
});