Как заставить jQuery.parseXML работать в node.js

Я пытаюсь использовать jQuery parseXml в node.js

Я получаю эту ошибку:

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

Но проблема не в XML.

Проблема в node-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;
    },

Проще говоря, в node.js нет ни DOMParser, ни ActiveXObject ("Microsoft.XMLDOM")

Поскольку я работаю в Windows, я ожидал, что ActiveXObject будет работать, но нет, это не так, фактическая ошибка, проглоченная jQuery, не является недопустимым XML, это то, что ActiveXObject не определен:

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:

Какие-нибудь обходные пути для этого? Как заставить работать jQuery.parseXML?


person Luxspes    schedule 27.07.2012    source источник


Ответы (3)


Я добился большого успеха, используя xmldom. Взглянем. Кажется, он анализирует xml, как и следовало ожидать от $.parseXML. У меня также были проблемы с парсером jquery, и я переключился на него после нескольких попыток.

person M. Laing    schedule 28.07.2012

Если вы хотите продолжать использовать jQuery.parseXML без внесения каких-либо изменений в свой код (например, если вы хотите иметь возможность запускать один и тот же javascript как на стороне клиента, так и в Node.js), это легко настроить. Модуль xmldom, упомянутый в М. Ответ Лаинга предоставляет DOMParser конструктор, который jQuery может использовать так же, как и DOMParser в браузере. Вот как это сделать:

Сначала установите xmldom:

npm install xmldom --save

Предполагая, что у вас уже есть jQuery 2.1.x или выше, работающий в Node.js (инструкции по его настройке см. В README в этот репозиторий), теперь вы можете просто потребовать xmldom и предоставить его DOMParser конструктор как глобальный:

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

jQuery теперь сможет успешно parseXML.

person Andrew Patton    schedule 04.09.2014

Похоже, это должно быть реализовано в ядре nodejs. Я бы предложил использовать модуль, предназначенный для анализа XML.

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

Вам нужен jQuery.parseXML для работы, например, вы пытаетесь написать код для перехода в браузер и запуска на сервере?

Вероятно, вы могли бы открыть node-xml2js в браузере с помощью browserify

Также существует libxmljs, который больше похож на XML, чем на node-xml2js.

person travis    schedule 27.07.2012