2010-07-08 6 views
2

J'ai ce fichier xml. Je voudrais extraire le premier enfant du nœud Status et l'alerter. Comment je peux le faire?Obtenir le premier enfant du nœud xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <ns3:ExecuteResponse xmlns:ns1="http://www.opengis.net/ows/1.1" xmlns:ns2="http://www.w3.org/1999/xlink" xmlns:ns3="http://www.opengis.net/wps/1.0.0" statusLocation="http://r/6de0e29d-8d67-40c3-8189-03f7cd23a0cb" serviceInstance="http://-service/services/http-post" version="1.0.0" service="WPS"> 
    <ns3:Process ns3:processVersion="0.2"> 
     <ns1:Identifier>123</ns1:Identifier> 
     <ns1:Title xml:lang="en-US">Bioclim</ns1:Title> 
     <ns1:Abstract xml:lang="en-US">Uses mean and standard deviation for each environmental variable separately to calculate bioclimatic envelopes. Level of fitness between the environmental values on a point and the respective envelopes classifies points as Suitable, Marginal, or Unsuitable for presence. 
Implements the Bioclimatic Envelope Algorithm. For each given environmental variable the algorithm finds the mean and standard deviation (assuming normal distribution) associated to the occurrence points. Each variable has its own envelope represented by the interval [m - c*s, m + c*s], where 'm' is the mean; 'c' is the cutoff input parameter; and 's' is the standard deviation. Besides the envelope, each environmental variable has additional upper and lower limits taken from the maximum and minimum values related to the set of occurrence points. 
In this model, any point can be classified as: 
Suitable: if all associated environmental values fall within the calculated envelopes; 
Marginal: if one or more associated environmental value falls outside the calculated envelope, but still within the upper and lower limits. 
Unsuitable: if one or more associated enviromental value falls outside the upper and lower limits. 
Bioclim's categorical output is mapped to probabilities of 1.0, 0.5 and 0.0 respectively.</ns1:Abstract> 
    </ns3:Process> 
    <ns3:Status creationTime="2010-07-08T16:33:03.326+02:00"> 

     <ns3:ProcessStarted/> 
    </ns3:Status> 
    <ns3:ProcessOutputs> 
     <ns3:Output> 
      <ns1:Identifier>servicesDocuments</ns1:Identifier> 
      <ns1:Title xml:lang="en-US">A json document in which can be published some XML documents relative to the run</ns1:Title> 
      <ns3:Data> 
       <ns3:LiteralData>http://hermes.pin.unifi.it:9090/wps-1.0.0-service/publisher/953baf3a-dddf-49cc-a673-7491d82f80b7</ns3:LiteralData> 

      </ns3:Data> 
     </ns3:Output> 
     <ns3:Output> 
      <ns1:Identifier>extendedStatus</ns1:Identifier> 
      <ns1:Title xml:lang="en-US">WPS status in JSON format</ns1:Title> 
      <ns3:Data> 
       <ns3:LiteralData>{&quot;globalStatus&quot;:&quot;processExecution&quot;,&quot;resourceList&quot;:[]}</ns3:LiteralData> 

      </ns3:Data> 
     </ns3:Output> 
    </ns3:ProcessOutputs> 
</ns3:ExecuteResponse> 

J'utilise jQuery. J'ai converti le xml en dom et maintenant je dois l'interroger pour extraire l'enfant du nœud Status.

$.ajax({ 
    type: 'GET', 
    url: "php/proxy.php?proxy_url=" + obj.requests[i].output, 
         contentType: "text/xml", 
    dataType: "text/xml", 
    async:false, 
    success: function(xml){ 
     var $dom = $.xmlDOM(xml, function(error){ 
    alert('A parse error occurred! ' + error); 
    }); 
           //extract data 

     }}); 

Merci beaucoup.

Répondre

3

Cela fonctionne pour moi. J'ai optimisé la façon dont vous gérez l'URL à partir de laquelle vous obtenez le XML.

var url = 'php/proxy.php'; 
var obj = { requests: [{output: 'foo'}] }, i = 0; // shims 
$.ajax({ 
    url: url, 
    type: 'GET', 
    // This is a better way to pass querystring params 
    data: { 'proxy_url': obj.requests[i].output }, 
    dataType: "xml", 
    async: false, 
    success: function(xmlData, textStatus, XMLHttpRequest){ 
     // How do we get ahold of the ns3:Status element? 
     // We must escale the ":" character: 
     var $ns3Status = $('ns3\\:Status', xmlData); 
     alert($ns3Status.attr('creationTime')); // we can get an attribute 
     alert($ns3Status.get(0).tagName); // we can get tagName 

     // Let's iterate over the children of the ns3:Status element 
     $ns3Status.children().each(function(){ 
      alert($(this).get(0).tagName); 
     }); 
    } 
}); 
1

Utilisez le type de données "xml" pour éviter d'avoir à analyser le code XML. (C'est la troisième fois que je vous le suggère, vous n'avez jamais dit pourquoi vous ne pouvez pas le faire). Notez que dans IE, le premier enfant sera un élément <ns3:ProcessStarted> tandis que dans les autres navigateurs, il s'agira d'un nœud de texte contenant des espaces.

$.ajax({ 
    type: 'GET', 
    url: "php/proxy.php?proxy_url=" + obj.requests[i].output, 
    contentType: "text/xml", 
    dataType: "xml", 
    async: false, 
    success: function(xml) { 
     var statusNode = xml.getElementsByTagName("ns3:Status")[0]; 
     alert(statusNode.firstChild); 
    } 
}); 

Vous pouvez envelopper le document XML dans un objet jQuery si vous voulez, et qui contourner le problème du nœud espaces en ignorant:

$.ajax({ 
    type: 'GET', 
    url: "php/proxy.php?proxy_url=" + obj.requests[i].output, 
    contentType: "text/xml", 
    dataType: "xml", 
    async: false, 
    success: function(xml) { 
     var node = $(xml).find("ns3\\:Status").find(":first-child"); 
     alert(node[0].tagName); 
    } 
}); 
0

Il y a quelques très bons plugins jQuery cela pourrait aider avec ça. J'ai récemment utilisé l'un des plugins xml2json, afin que je puisse référencer des parties spécifiques de mon XML retourné en utilisant la syntaxe JSON.

var ExecuteResponse = jQuery.xml2json(xml); 
var firstStatusChild = ExecuteResponse.Status[0]; 
+1

C'est complètement inutile. Utilisez "xml" comme "dataType" et vous obtenez un document XML. –

+0

Je suis d'accord, utile de savoir à propos de xml2json, mais trop pour cette tâche. – artlung

Questions connexes