115 votes

Analyser le XML en utilisant JavaScript

Je dois être capable d'analyser le XML en utilisant JavaScript. Le XML sera dans une variable. Je préférerais ne pas utiliser jQuery ou d'autres frameworks.

J'ai examiné cette question, XML > lecture de jQuery .

210voto

Enigmadan Points 1031

Je suppose que d'après votre dernière question Il s'agit d'une question posée 20 minutes avant celle-ci, dans laquelle vous essayez d'analyser (lire et convertir) le XML trouvé en utilisant FindNearestAddress de GeoNames.

Si votre XML se trouve dans une variable de type chaîne appelée txt et ressemble à ceci :

<address>
  <street>Roble Ave</street>
  <mtfcc>S1400</mtfcc>
  <streetNumber>649</streetNumber>
  <lat>37.45127</lat>
  <lng>-122.18032</lng>
  <distance>0.04</distance>
  <postalcode>94025</postalcode>
  <placename>Menlo Park</placename>
  <adminCode2>081</adminCode2>
  <adminName2>San Mateo</adminName2>
  <adminCode1>CA</adminCode1>
  <adminName1>California</adminName1>
  <countryCode>US</countryCode>
</address>

Ensuite, vous pouvez analyser le XML avec Javascript DOM comme ceci :

if (window.DOMParser)
{
    parser = new DOMParser();
    xmlDoc = parser.parseFromString(txt, "text/xml");
}
else // Internet Explorer
{
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;
    xmlDoc.loadXML(txt);
}

Et obtenir des valeurs spécifiques des noeuds comme ceci :

//Gets house address number
xmlDoc.getElementsByTagName("streetNumber")[0].childNodes[0].nodeValue;

//Gets Street name
xmlDoc.getElementsByTagName("street")[0].childNodes[0].nodeValue;

//Gets Postal Code
xmlDoc.getElementsByTagName("postalcode")[0].childNodes[0].nodeValue;

JSFiddle


Fév. 2019 edit :

En réponse aux préoccupations de @gaugeinvariante concernant le xml avec des préfixes Namespace. Si vous avez besoin d'analyser du xml avec des préfixes Namespace, tout devrait fonctionner de manière presque identique :

REMARQUE : cela ne fonctionnera que dans les navigateurs qui prennent en charge les préfixes d'espace de nom xml, comme Microsoft Edge.

// XML with namespace prefixes 's', 'sn', and 'p' in a variable called txt
txt = `
<address xmlns:p='example.com/postal' xmlns:s='example.com/street' xmlns:sn='example.com/streetNum'>
  <s:street>Roble Ave</s:street>
  <sn:streetNumber>649</sn:streetNumber>
  <p:postalcode>94025</p:postalcode>
</address>`;

//Everything else the same
if (window.DOMParser)
{
    parser = new DOMParser();
    xmlDoc = parser.parseFromString(txt, "text/xml");
}
else // Internet Explorer
{
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;
    xmlDoc.loadXML(txt);
}

//The prefix should not be included when you request the xml namespace
//Gets "streetNumber" (note there is no prefix of "sn"
console.log(xmlDoc.getElementsByTagName("streetNumber")[0].childNodes[0].nodeValue);

//Gets Street name
console.log(xmlDoc.getElementsByTagName("street")[0].childNodes[0].nodeValue);

//Gets Postal Code
console.log(xmlDoc.getElementsByTagName("postalcode")[0].childNodes[0].nodeValue);

18voto

faino Points 1725

La procédure suivante permet d'analyser une chaîne XML pour obtenir un document XML dans tous les principaux navigateurs, y compris Internet Explorer 6. Une fois que vous avez ce document, vous pouvez utiliser les méthodes/propriétés habituelles de traversée du DOM telles que childNodes et getElementsByTagName() pour obtenir les nœuds que vous voulez.

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

Exemple d'utilisation :

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

Que j'ai obtenu de https://stackoverflow.com/a/8412989/1232175 .

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