2012-07-27 23 views
5

Estoy tratando de usar jQuery parseXML en Node.js¿Cómo puedo hacer el trabajo jQuery.parseXML en Node.js

estoy recibiendo este error:

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

Pero el problema es no en el XML

el problema está en los ganglios-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; 
    }, 

En pocas palabras, en Node.js, no hay DOMParser, y no hay ActiveXObject ("Microsoft.XMLDOM")

Desde que estoy trabajando en las ventanas, yo esperaría ActiveXObject funcione, pero no, no es así, el error real tragado por jQuery no es un XML válido es que ActiveXObject no está definido:

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: 

soluciones provisionales para esta? ¿Cómo puedo hacer que jQuery.parseXML funcione?

Respuesta

6

He tenido un gran éxito usando xmldom. Echar un vistazo. Parece analizar un xml como lo esperaría $.parseXML. También estaba teniendo problemas con el analizador de jquery y cambié a este después de probar un montón.

1

Eso parece ser algo que tendría que implementarse en el núcleo de nodejs. Sugeriría usar un módulo diseñado para analizar XML.

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

¿Necesita jQuery.parseXML para trabajar, como está tratando de escribir código para cruzar hacia el navegador y ejecutar en el servidor?

Probablemente se podría exponer a node-xml2js en el navegador con browserify

También hay libxmljs que parece ser más XML como de ganglios xml2js.

+0

Estoy usando ese mismo módulo (node-xml2js) y simplemente funciona. –

5

Si desea continuar utilizando jQuery.parseXML sin tener que realizar ningún cambio en el código (por ejemplo, si desea poder ejecutar el mismo javascript tanto en el lado del cliente como en Node.js), es fácil establecer eso arriba. El módulo xmldom mencionado en M. Laing’s answer expone un constructor DOMParser que jQuery puede usar de la misma manera que usa DOMParser en el navegador. He aquí cómo hacerlo:

primer lugar, instale xmldom:

npm install xmldom --save 

Asumiendo que ya tiene 2.1.x jQuery o mayor que trabaja en Node.js (para obtener instrucciones sobre la configuración que hasta, ver el README en this repository), puede ahora sólo requieren xmldom y exponer su DOMParser constructor como mundial:

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

jQuery ahora será capaz de éxito parseXML.

Cuestiones relacionadas