208 votes

Analyse syntaxique XML d'une chaîne variable en JavaScript

J'ai un chaîne variable qui contient un XML bien formé et valide. Je dois utiliser du code JavaScript pour analyser ce flux.

Comment puis-je réaliser cela en utilisant un code JavaScript (compatible avec le navigateur) ?

327voto

Tim Down Points 124501

Réponse actualisée pour 2017

Ce qui suit analysera une chaîne XML pour en faire un document XML dans tous les principaux navigateurs. À moins que vous n'ayez besoin du support d'IE <= 8 ou d'un navigateur obscur, vous pouvez utiliser la fonction suivante :

function parseXml(xmlStr) {
   return new window.DOMParser().parseFromString(xmlStr, "text/xml");
}

Si vous devez prendre en charge IE <= 8, ce qui suit fera l'affaire :

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");
}

Une fois que vous avez un Document obtenu par parseXml vous pouvez utiliser les méthodes et propriétés habituelles de traversée du DOM, telles que childNodes et getElementsByTagName() pour obtenir les nœuds que vous voulez.

Exemple d'utilisation :

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

Si vous utilisez jQuery, vous pouvez, à partir de la version 1.5, utiliser le module intégré parseXML() qui est fonctionnellement identique à la fonction ci-dessus.

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

60 votes

Je suis d'accord, cette réponse devrait être acceptée. Ma réponse est si vieille, elle date des premiers jours, que j'ai toujours trouvé curieux qu'elle obtienne encore des votes positifs. Qui est en faveur de la suppression de ma réponse acceptée ? Le système de vote est-il défectueux ? Votez pour cette réponse !

0 votes

@SanderVersluys : Pouvez-vous supprimer votre réponse ?

0 votes

@Witman en fait, je ne peux pas car c'est la réponse acceptée... j'ai mis à jour ma réponse pour refléter cela...

91voto

Sander Versluys Points 13953

Mise à jour : Pour une réponse plus correcte, voir La réponse de Tim Down .

Internet Explorer et, par exemple, les navigateurs basés sur Mozilla exposent différents objets pour l'analyse XML, il est donc judicieux d'utiliser un framework JavaScript comme jQuery pour gérer les différences entre navigateurs.

Voici un exemple très simple :

var xml = "<music><album>Beethoven</album></music>";

var result = $(xml).find("album").text();

Note : Comme indiqué dans les commentaires, jQuery ne fait pas vraiment d'analyse XML, il s'appuie sur la méthode DOM innerHTML et l'analysera comme n'importe quel HTML, donc faites attention lorsque vous utilisez des noms d'éléments HTML dans votre XML. Mais je pense qu'il fonctionne assez bien pour un simple "parsing" XML, mais il n'est probablement pas suggéré pour un parsing XML intensif ou "dynamique" où vous ne savez pas à l'avance quel XML va arriver et cela teste si tout est analysé comme prévu.

6 votes

Le code permettant de faire abstraction de la différence d'analyse XML entre IE et les autres navigateurs ne représente que quelques lignes triviales, et ne vaut donc pas la peine d'ajouter 50 000 euros de jQuery à lui seul. Manipuler le DOM du XML résultant est une autre affaire.

8 votes

Et ce que je n'avais pas réalisé au moment de poster mon commentaire précédent, c'est que jQuery n'analyse même pas le XML, il se contente de l'assigner à l'élément innerHTML d'un élément, ce qui n'est pas du tout fiable.

0 votes

Notez que JQuery ne prend pas en charge les espaces de noms XML. Voir zachleat.com/web/2008/05/10/sélectionner-xml-avec-javascript

19voto

Cerebrus Points 18045

La plupart des exemples sur le web (et certains présentés ci-dessus) montrent comment charger un fichier XML à partir d'un fichier d'une manière compatible avec les navigateurs. Cela s'avère facile, sauf dans le cas de Google Chrome qui ne prend pas en charge l'option document.implementation.createDocument() méthode. Avec Chrome, pour charger un fichier XML dans un objet XmlDocument, vous devez utiliser l'objet XmlHttp intégré, puis charger le fichier en passant son URI.

Dans votre cas, le scénario est différent, car vous voulez charger le XML à partir d'une variable de type chaîne et non une URL. Pour cette exigence cependant, Chrome est censé fonctionner comme Mozilla (du moins, c'est ce que j'ai entendu) et supporte la méthode parseFromString().

Voici une fonction que j'utilise (elle fait partie de la bibliothèque de compatibilité avec les navigateurs que je suis en train de construire) :

function LoadXMLString(xmlString)
{
  // ObjectExists checks if the passed parameter is not null.
  // isString (as the name suggests) checks if the type is a valid string.
  if (ObjectExists(xmlString) && isString(xmlString))
  {
    var xDoc;
    // The GetBrowserType function returns a 2-letter code representing
    // ...the type of browser.
    var bType = GetBrowserType();

    switch(bType)
    {
      case "ie":
        // This actually calls into a function that returns a DOMDocument 
        // on the basis of the MSXML version installed.
        // Simplified here for illustration.
        xDoc = new ActiveXObject("MSXML2.DOMDocument")
        xDoc.async = false;
        xDoc.loadXML(xmlString);
        break;
      default:
        var dp = new DOMParser();
        xDoc = dp.parseFromString(xmlString, "text/xml");
        break;
    }
    return xDoc;
  }
  else
    return null;
}

16 votes

Je suis conscient des opinions controversées concernant le reniflage de navigateur et c'est la raison pour laquelle je n'ai pas inclus cette fonction ici. Cependant, il n'a pas été établi que c'était FAUX. Dans tous les cas, il s'agit d'une suggestif exemple.

1 votes

Je pense que c'est mal dans la mesure où vous ne pouvez pas garantir que c'est bien. N'importe qui peut usurper les chaînes UA, et il est douteux que TOUS les navigateurs non-IE supportent DOMParser, et que votre reniflage de navigateur soit PARFAIT. De plus, il est beaucoup plus facile de le faire de la bonne façon : if(window.ActiveXObject){...}

0 votes

Donc maintenant IE9+ supporte le DOMParser comment allez-vous soutenir cela ? -1 pour ce que dit @1j01. Tout ce que vous devez vérifier est var dp; try{ dp = new DOMParser() } catch(e) { }; if(dp) { // DOMParser supported } else { // alert('you need to consider upgrading your browser\nOr pay extra money so developer can support the old versions using browser sniffing (eww)') } .

13voto

Mike McMillien Points 111

Billets de banque est un analyseur XML JavaScript léger et multi-navigateurs. Il est orienté objet et contient de nombreux exemples, ainsi que la fonction API est documenté. Il est assez récent, mais il a bien fonctionné dans un de mes projets jusqu'à présent. Ce qui me plaît, c'est qu'il lit directement le XML à partir de chaînes de caractères ou d'URL et que vous pouvez également l'utiliser pour convertir le XML en JSON.

Voici un exemple de ce que vous pouvez faire avec Marknote :

var str = '<books>' +
          '  <book title="A Tale of Two Cities"/>' +
          '  <book title="1984"/>' +
          '</books>';

var parser = new marknote.Parser();
var doc = parser.parse(str);

var bookEls = doc.getRootElement().getChildElements();

for (var i=0; i<bookEls.length; i++) {
    var bookEl = bookEls[i];
    // alerts "Element name is 'book' and book title is '...'"
    alert("Element name is '" + bookEl.getName() + 
        "' and book title is '" + 
        bookEl.getAttributeValue("title") + "'"
    );
}

0 votes

Il semble billet de banque met en œuvre un analyseur syntaxique purement javascript. Cela signifie qu'il devrait être compatible avec n'importe quel moteur javascript, qu'il soit utilisé dans un navigateur, dans node.js ou dans un moteur javascript autonome...

0 votes

A partir du 6/2021, veuillez noter que Marknote n'est plus maintenu. fast-xml-parser est une alternative maintenue.

8voto

Jamie Pate Points 470

Apparemment, jQuery fournit maintenant jQuery.parseXML. http://api.jquery.com/jQuery.parseXML/ à partir de la version 1.5

jQuery.parseXML( data ) Les retours : XMLDocument

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X