2010-05-25 10 views
5

che sto usando jQuery per analizzare un po 'di XML, in questo modo:jQuery non analizzare XML con nodi chiamati opzione

function enumOptions(xml) { 
    $(xml).find("animal").each(function(){ 
     alert($(this).text()); 
    }); 
} 

enumOptions("<root><animal>cow</animal><animal>squirrel</animal></root>"); 

Questa grande opera. Tuttavia se provo e cerco i nodi chiamati "opzione", allora non funziona:

function enumOptions(xml) { 
    $(xml).find("option").each(function(){ 
     alert($(this).text()); 
    }); 
} 

enumOptions("<root><option>cow</option><option>squirrel</option></root>"); 

Non c'è nessun errore, proprio nulla viene allertato, come se il ritrovamento non è trovare nulla. Lo fa solo per i nodi chiamati option tutto il resto che ho testato funziona ok!

Sto usando la versione corrente di jQuery - 1.4.2.

Qualche idea?

TIA.

bg

+1

jQuery in realtà non gestisce "XML". Usa il browser per interpretare il markup tramite il meccanismo "innerHTML". Quindi, quello che stai dando è interpretato come HTML, piaccia o no. Tutto ciò che appare come un ** tag HTML ** reale verrà trattato allo stesso modo in cui lo sarebbe se lo avessi inserito nel markup della pagina. Se si trova in un posto strano, relativamente a dove dovrebbe essere (come un '

risposta

9

Aggiornamento

jQuery ha questo metodo built-in ora. È possibile utilizzare

$.parseXML("..") 

per costruire il DOM XML da una stringa.


jQuery si basa sul DOM HTML utilizzando innerHTML per analizzare il documento che può avere risultati inaffidabili quando i nomi dei tag si scontrano con quelli in HTML.

Invece, è possibile utilizzare un parser XML corretto per analizzare prima il documento e quindi utilizzare jQuery per l'esecuzione di query. Il metodo qui di seguito vi analizzare un documento XML valido in maniera cross-browser:

// http://www.w3schools.com/dom/dom_parser.asp 
function parseXML(text) { 
    var doc; 

    if(window.DOMParser) { 
     var parser = new DOMParser(); 
     doc = parser.parseFromString(text, "text/xml"); 
    } 
    else if(window.ActiveXObject) { 
     doc = new ActiveXObject("Microsoft.XMLDOM"); 
     doc.async = "false"; 
     doc.loadXML(text); 
    } 
    else { 
     throw new Error("Cannot parse XML"); 
    } 

    return doc; 
} 

Una volta che il DOM XML è costruito, jQuery può essere utilizzato come normale - http://jsfiddle.net/Rz7Uv/

var text = "<root><option>cow</option><option>squirrel</option></root>"; 
var xml = parseXML(text); 
$(xml).find("option"); // selects <option>cow</option>, <option>squirrel</option> 
+0

Risposta davvero utile. Mi sono imbattuto in un problema simile quando stavo cercando di aggiungere XML grezzo a un documento con '$ (pub.xmlDoc) .find ("pubblicazione> immagini"). Aggiungere (" foo ")' e" "stavo trasformato in" " Quello che ho fatto è stato l'uso ... ' $ (pub.xmlDoc) .find (" pubblicazione> immagini "). accoda (DOMParser(). parseFromString (" foo "," text/xml ")' Nota Sto prendendo una scorciatoia qui e presumo non IE (che funziona per questa applicazione) –

+0

@TimHolt - questo è un approccio pulito, ma questa risposta è vecchia. nel metodo 'parseXML' che Puoi usare. Permettimi di aggiornare la risposta. – Anurag

1

Questo è probabilmente un po 'di gestione speciale per l'elemento HTML <option>, ma non riesco a trovare che la fonte.

+0

+1: è corretto, ho visto la stessa cosa con '

' in XML, qualsiasi elemento html valido con cui il browser potrebbe interferire. –

1

On line 4448 della sorgente unminified per 1.4.2 è il colpevole:

// (div = a div node) 
// (elem = the xml you've passed to it) 

div.innerHTML = wrap[1] + elem + wrap[2]; 

Considerate questo codice:

var d = document.createElement('div'); 
d.innerHTML = "<foo><option>bar</option><b>blah</b></foo>"; 

alert(d.innerHTML); // <foo>bar<b>blah</b></foo> 

// tested on Firefox 3.6 

Quindi, non chiedetemi perché esattamente, ma sembra come qualcosa nel modo in cui il DOM lo gestisce, non necessariamente per colpa di jQuery.

Forse basta usare un nome di nodo diverso?

+3

Ho appena trovato anche questo. Per quello che posso dire, jQuery non esegue alcun tipo di parsing XML: fa leva su "innerHTML" per convertire una stringa in nodi DOM. Quindi, non stiamo parlando nemmeno dell'XML: è tutto ciò che puoi convincere che il parser HTML del browser è un markup valido. – Pointy

+0

@Pointy - buona risposta - dovresti renderlo una risposta – nickf