2012-07-27 28 views
5

Sto cercando di utilizzare jQuery parseXML in node.jsCome posso far funzionare jQuery.parseXML in node.js

sto ottenendo questo errore:

Error: Invalid XML: <?xml version="1.0"... 

Ma il problema non è nel XML

il problema è nel nodo-jquery.js:

parseXML: function(data) { 
     if (typeof data !== "string" || !data) { 
      return null; 
     } 
     var xml, tmp; 
     try { 
      if (window.DOMParser) { // Standard 
       tmp = new DOMParser(); 
       xml = tmp.parseFromString(data , "text/xml"); 
      } else { // IE 
       xml = new ActiveXObject("Microsoft.XMLDOM"); 
       xml.async = "false"; 
       xml.loadXML(data); 
      } 
     } catch(e) { 
      xml = undefined; 
     } 
     if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) { 
      jQuery.error("Invalid XML: " + data); 
     } 
     return xml; 
    }, 

Per dirla semplicemente, in node.js, non v'è alcuna DOMParser, e non c'è ActiveXObject ("Microsoft.XMLDOM")

Dal momento che sto lavorando in finestre, mi sarei aspettato ActiveXObject al lavoro, ma no, non è così, l'errore effettivo inghiottito da jQuery non è un XML non valido è che ActiveXObject non è definito:

ReferenceError: ActiveXObject is not defined 
at Module._compile (module.js:449:26) 
at Object.Module._extensions..js (module.js:467:10) 
at Module.load (module.js:356:32) 
at Function.Module._load (module.js:312:12) 
at Module.runMain (module.js:492:10) 
at process.startup.processNextTick.process._tickCallback (node.js:244: 

alcuna soluzione alternativa per questo? Come posso far funzionare jQuery.parseXML?

risposta

6

Ho avuto un grande successo utilizzando xmldom. Guarda. Sembra analizzare un xml proprio come ti aspetteresti da $.parseXML a. Avevo anche problemi con il parser jquery e passai a questo dopo aver provato un po 'fuori.

1

Sembra essere qualcosa che dovrebbe essere implementato nel core di nodejs. Suggerirei di utilizzare un modulo progettato per analizzare XML.

https://github.com/Leonidas-from-XIV/node-xml2js

Avete bisogno jQuery.parseXML al lavoro, come stai cercando di scrivere il codice per attraversare nel browser ed eseguire sul server?

Probabilmente si potrebbe esporre node-xml2js nel browser con browserify

C'è anche libxmljs, che sembra essere più di XML come di nodo-xml2js.

+0

Sto usando quel modulo (node-xml2js) e funziona. –

5

Se si desidera continuare a utilizzare jQuery.parseXML senza dover apportare alcuna modifica al codice (ad esempio se si desidera essere in grado di eseguire la stessa javascript sia sul lato client che in Node.js), è facile impostare quello su. Il modulo xmldom menzionato in M. Laing’s answer espone un costruttore DOMParser che jQuery può utilizzare nello stesso modo in cui utilizza DOMParser nel browser. Ecco come farlo:

prima cosa, installare xmldom:

npm install xmldom --save 

si Supponendo che già jQuery 2.1.x o superiore lavorando in Node.js (per le istruzioni sulla sua configurazione, vedere il README in this repository), è possibile ora solo bisogno di xmldom ed esporre la sua DOMParser costruttore come un globale:

global.DOMParser = require('xmldom').DOMParser; 

jQuery sarà ora in grado di successo parseXML.

Problemi correlati