Кросс-браузерный анализ XML Javascript - PullRequest
61 голосов
/ 31 октября 2011

Существуют ли кросс-браузерные / кроссплатформенные способы анализа XML-файлов в Javascript?

Ответы [ 3 ]

61 голосов
/ 31 октября 2011

Следующее будет работать во всех основных браузерах, включая IE 6:

var parseXml;

if (typeof window.DOMParser != "undefined") {
    parseXml = function(xmlStr) {
        return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
    };
} else if (typeof window.ActiveXObject != "undefined" &&
       new window.ActiveXObject("Microsoft.XMLDOM")) {
    parseXml = function(xmlStr) {
        var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlStr);
        return xmlDoc;
    };
} else {
    throw new Error("No XML parser found");
}

Пример использования:

var xml = parseXml("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);

Демонстрационная версия:

var parseXml;

if (typeof window.DOMParser != "undefined") {
    parseXml = function(xmlStr) {
        return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
    };
} else if (typeof window.ActiveXObject != "undefined" &&
       new window.ActiveXObject("Microsoft.XMLDOM")) {
    parseXml = function(xmlStr) {
        var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlStr);
        return xmlDoc;
    };
} else {
    throw new Error("No XML parser found");
}

var xml = parseXml("<foo>Stuff</foo>");
document.body.innerHTML = "Root element: " + xml.documentElement.nodeName;
6 голосов
/ 31 октября 2011

Рассмотрите возможность использования jQuery.parseXML .

Обратите внимание, что старый код JQuery (до 2.x) по существу идентичен коду, предложенному в принятом ответе, и может быть найден в http://code.jquery.com/jquery-1.9.1.js, частичной версии ниже:

// Cross-browser xml parsing
parseXML: function( data ) {
    ...
    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;
    }
    ...
}

Запуск кода JQuery 2.x изменен, чтобы пропустить ветку ActiveX, если она вам все еще нужна - используйте более старую версию JQuery или встроенный анализ ActiveX. Частичный код от http://code.jquery.com/jquery-2.0.0.js:

// Cross-browser xml parsing
parseXML: function( data ) {
    var xml, tmp;
    .....
    // Support: IE9
    try {
        tmp = new DOMParser();
        xml = tmp.parseFromString( data , "text/xml" );
    } catch ( e ) {
        xml = undefined;
    }
    .....
},
4 голосов
/ 12 сентября 2012

Если вам нужно проанализировать большие XML-документы, которые вы не можете полностью сохранить в памяти, рассмотрите возможность использования синтаксического анализатора в стиле SAX, как этот:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...