2010-11-29 20 views
1

J'ai écrit un service de recherche basé sur Solr pour indexer une base de données d'objets appelés clips. Le service de recherche renvoie les résultats de recherche formatés à l'aide des formats d'extensions d'atome OpenSearch. Les clips ont diverses propriétés, ClipID et Title sont les deux propriétés pertinentes à ma question.Utilisez JQuery pour extraire la valeur textuelle de l'élément xml appelé "Title" dans IE 8

J'ai écrit un programme JavaScript très simple en utilisant jquery qui invoque le service de recherche de manière asynchrone en arrière-plan et remplit une table avec les valeurs ClipId et Title. Le programme fonctionne correctement sur Chrome, Safari et FF. Cependant, sur IE, il échoue simplement à analyser la valeur de l'attribut Title. C'est comme si "Title" est un nom de balise XML réservé et que jQuery sur IE simple ne le trouve pas.

Voici l'extrait de mon programme JavaScript:

// Ajax call to the search service over HTTP. 
    var doSearch = function(){ 
    var query = "Title:" + $("#searchQuery").val() + "*"; 

    $.ajax({ 
     url : "/quantel/search/select" , 
     data:{q:query}, 
     error:function(request,status,error){ 
     alert(request + "," + status + "," + error); 
     }, 
     dataType: "text/xml", 
     success:function(data,status,request){ 
     // Clear the data table. 
     $("#searchResults").dataTable().fnClearTable(); 
     // Search for all clip entries in the XML document. 
     $(data).find("entry").children("content").each(function(index,element) { 

     var clipID= $(element).children("ClipID").text(); 
     var title = $(element).children("Title").text(); 

     // Add the clip id and title to the table. 
     $("#searchResults").dataTable().fnAddData([clipID,title]); 
     });  
     } 
    }); 
    }; 

Et voici un échantillon des résultats de recherche que je suis en train d'analyser. Comme vous pouvez le voir, la balise Content contient une balise Title, mais IE ne peut tout simplement pas la trouver.

<?xml version="1.0" encoding="UTF-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"> 
<title>ProjectFolders Search</title> 
<link href="http://localhost:8182/quantel/search/select?q=guillaume*&amp;rows=100&amp;" /> 
<link rel="self" href="http://localhost:8182/quantel/search/select?q=guillaume*&amp;rows=100&amp;" /> 
<link rel="first" href="http://localhost:8182/quantel/search/select?q=guillaume*&amp;rows=100&amp;start=0" /> 
<link rel="last" href="http://localhost:8182/quantel/search/select?q=guillaume*&amp;rows=100&amp;start=0" /> 
<link rel="previous" href="http://localhost:8182/quantel/search/select?q=guillaume*&amp;rows=100&amp;start=0" /> 
<link rel="next" href="http://localhost:8182/quantel/search/select?q=guillaume*&amp;rows=100&amp;start=0" /> 
<updated>2010-11-29T14:45:53.796Z</updated> 
<author> 
    <name>Quantel</name> 
</author> 
<id>urn:uuid:cd9d3362-2159-4c27-a99e-9691dd4ff707</id> 
<opensearch:totalResults>6</opensearch:totalResults> 
<opensearch:startIndex>0</opensearch:startIndex> 
<opensearch:itemsPerPage>100</opensearch:itemsPerPage> 
<entry> 
    <title type="html">Guillaume_clip</title> 
    <updated>2010-10-25T11:10:17.000+01:00</updated> 
    <id>urn:clipid:389685</id> 
    <link href="http://localhost:8182/quantel/search/select?q=ClipID:389685" /> 
    <content type="text/xml"> 
    <PlaceHolder>0</PlaceHolder> 
    <HasEditData>0</HasEditData> 
    <id>389685</id> 
    <ClipID>389685</ClipID> 
    <Created>2010-10-25T11:10:17.000+01:00</Created> 
    <NumVidTracks>0</NumVidTracks> 
    <CloneZone>119</CloneZone> 
    <MosActive>0</MosActive> 
    <Template>0</Template> 
    <Completed>2010-10-25T11:10:18.000+01:00</Completed> 
    <Frames>0</Frames> 
    <Title>Guillaume_clip</Title> 
    <UnEdited>1</UnEdited> 
    <ClipGUID>7e5aef9c7da44bacbfb49500710138cf</ClipGUID> 
    <CloneID>389685</CloneID> 
    <NumAudTracks>0</NumAudTracks> 
    </content> 
</entry> 
</feed> 
+0

Mais la ligne avec '" ClipID "' fonctionne? (Aussi, pouvez-vous essayer 'var title = element.getElementsByTagName (" Title ") [0];' à la place?) – Tomalak

+0

L'option 'dataType' de l'appel $ .ajax a une valeur invalide. Ce devrait être "xml". voir http://api.jquery.com/jQuery.ajax/ – thorn

+0

La ligne avec ClipID fonctionne. En fait, tenter de récupérer tous les champs autres que Title fonctionne. J'ai essayé var title = element.getElementsByTagName ("Title") [0] .text et cela fonctionne sur Chrome mais pas sur IE. –

Répondre

3

dataType L'option de l'appel $.ajax a une valeur non valide. Il devrait être xml. Voir http://api.jquery.com/jQuery.ajax

Dans votre cas avec un type de données non valide, IE analyse le contenu au format HTML, l'élément title est donc déplacé dans l'élément head. Le type MIME de la réponse doit également être text/xml. Si vous avez besoin de conserver un autre type MIME, vous pouvez analyser une réponse XML de la manière décrite ici: http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests

+0

Merci pour l'explication concernant l'élément titre étant déplacé à l'élément de tête. C'est logique. Cependant, quand je mets le dataType de $ .ajax à xml cela ne fonctionne pas et j'obtiens une erreur d'analyse. Je suis assez sûr que le XML est bien formé car je peux le lire directement à partir de IE et il ne se plaint pas. Au début, j'utilisais $ .get comme raccourci pour $ .ajax mais ça n'a pas marché. –

+0

Votre serveur renvoie-t-il le bon type MIME pour ce contenu (text/xml)? – thorn

+0

Le type MIME correct pour ce type de contenu est application/atom + xml –

0

Le titre doit être dans un espace de noms différent. Vous pouvez essayer

$ (elment) .find ('atom \: Title'). Text();

Sur iPad, vous ne pouvez pas l'essayer maintenant.