Récupérer les données XML vers JMPBonjour, j'essaie de récupérer des données météorologiques sous forme XML (service météo finlandais - https://en.ilmatieteenlaitos.fi/open-data-manual-fmi-wfs-services ) vers JMP de manière à ce que l'utilisateur puisse définir l'heure. période. Mon code ne fonctionne pas, j'obtiens toujours le message d'erreur "Etat de requête HTTP invalide".
// User-defined start and end dates (modify as needed)
startDate = "2024-07-10";
endDate = "2024-07-24";
// Construct the URL with user-defined dates and parameters
url = "https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=fmi::observations::weather::timevaluepair&place=helsinki-vantaa_airport×tep=1&starttime=" || startDate || "T00:00:00Z&endtime=" || endDate || "T23:59:59Z¶meters=temperature%2Chumidity%2Cpressure";
// Create HTTP request object
httpRequest = New HTTP Request();
// Send HTTP GET request
response = httpRequest << Send("GET", url);
// Check if the request was successful
If(response << Get Status Code == 200,
// Parse the XML response
xmlResponse = response << Get As XML,
// Extract data from XML response
dataNodes = xmlResponse << XPath("//wml2:MeasurementTVP"),
// Initialize lists to store data
temperatureList = {},
humidityList = {},
pressureList = {},
// Loop through each data node and extract values
ForEach(node in dataNodes,
// Extract timestamp
timestamp = node << XPath("wml2:time"),
// Extract temperature value
temperature = node << XPath("wml2:value[@parameter='temperature']"),
temperatureValue = temperature << NodeText,
// Extract humidity value
humidity = node << XPath("wml2:value[@parameter='humidity']"),
humidityValue = humidity << NodeText,
// Extract pressure value
pressure = node << XPath("wml2:value[@parameter='pressure']"),
pressureValue = pressure << NodeText,
// Convert timestamp to JMP DateTime format
timestampDT = Parse DateTime(timestamp, "YYYY-MM-DDThh:mm:ssZ"),
// Append data to lists
Append(temperatureList, {timestampDT, As Number(temperatureValue)}),
Append(humidityList, {timestampDT, As Number(humidityValue)}),
Append(pressureList, {timestampDT, As Number(pressureValue)})
);
// Create a new JMP data table and add columns
dt = New Table("Helsinki-Vantaa Weather Data",
Add Rows(Num Rows(temperatureList)),
New Column("Timestamp", Numeric, "DateTime"),
New Column("Temperature (°C)", Numeric, "Continuous", Format(3)),
New Column("Relative Humidity (%)", Numeric, "Continuous", Format(3)),
New Column("Pressure (hPa)", Numeric, "Continuous", Format(3))
);
// Populate the data table with values
dt:"Timestamp" << Set Values(temperatureList);
dt:"Temperature (°C)" << Set Values(humidityList);
dt:"Relative Humidity (%)" << Set Values(pressureList);
dt:"Pressure (hPa)" << Set Values(pressureList);
// Show the data table
dt << Show;
,
// Display error if request failed
Throw("Failed to fetch data. HTTP status code: " || Char(response << Get Status Code))
);Automatisation et scriptsAccès aux donnéesRe : Récupérer des données XML vers JMPLa syntaxe de la nouvelle requête HTTP est incorrecte. Voici un petit exemple qui devrait renvoyer quelques données
Names Default To Here(1);
startDate = "2024-07-10";
endDate = "2024-07-11";
// Construct the URL with user-defined dates and parameters
url = "https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=fmi::observations::weather::timevaluepair&place=helsinki-vantaa_airport×tep=1&starttime=" || startDate || "T00:00:00Z&endtime=" || endDate || "T23:59:59Z¶meters=temperature%2Chumidity%2Cpressure";
// Create HTTP request object
request = New HTTP Request(
Method("GET"),
URL(url)
);
data = request << send;
/*
Show(request << Get MIME Type);
*/Re : Récupérer des données XML vers JMPMerci @jthi, la requête HTTP fonctionne maintenant, mais il semble que le reste du script soit également défectueux. C'est la première fois que j'essaie d'obtenir des données à partir de XML.
Re : Récupérer des données XML vers JMPIl semble que vous utilisiez de la morue générée par LLM ? Si c'est le cas, ils sont à mon avis horribles avec JSL.
Je vous suggère d'enregistrer les données résultantes sous forme de fichier XML et d'utiliser l'aperçu de JMP pour obtenir le script source.

Cela nécessitera un peu de jeu, mais cela peut être analysé avec ceci (ou pourrait utiliser XPath Query() ou Parse XML() )

Vous pouvez ensuite utiliser le script source pour automatiser davantage votre processus et vous pouvez vous retrouver avec quelque chose comme


Re : Récupérer des données XML vers JMP
Re : Récupérer des données XML vers JMPVous trouverez ci-dessous le script que j'ai utilisé (j'ai déjà utilisé les données ouvertes d'Ilmatieteenlaitos dans JMP, mais je pense que j'ai utilisé des données différentes ou que je les ai analysées d'une manière un peu différente). Il utilise des techniques plus avancées telles que open(char to blob(), "text"), mais cela peut être évité en enregistrant d'abord le fichier en tant que fichier texte. Il propose également un nettoyage des données et une création de graphiques (vérifiez que les données qu'il crée sont correctes, je n'ai fait aucune vérification pour cela).
Voir plus...
Names Default To Here(1);
/*
https://en.ilmatieteenlaitos.fi/open-data
https://en.ilmatieteenlaitos.fi/open-data-manual-accessing-data
*/
location = "helsinki-vantaa_airport";
start_date = "2024-07-10";
end_date = "2024-07-11";
fmi_url = "https://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=fmi::observations::weather::timevaluepair&place=^location^×tep=1&starttime=^start_date^T00:00:00Z&endtime=^end_date^T23:59:59Z¶meters=temperature%2Chumidity%2Cpressure";
// Create HTTP request object
request = New HTTP Request(
Method("GET"),
URL(Eval Insert(fmi_url))
);
data = request << send;
dt = Open(
Char to blob(data),
XML Settings(
Stack(0),
Row(
"/wfs:FeatureCollection/wfs:member/omso:PointTimeSeriesObservation/om:result/wml2:MeasurementTimeseries/wml2:point"
),
Col(
"/wfs:FeatureCollection/wfs:member/omso:PointTimeSeriesObservation/om:result/wml2:MeasurementTimeseries/@gml:id",
Column Name(
"MeasurementID"
),
Fill("Use Forever"),
Type("Character"),
Format({"Best"}),
Modeling Type("Continuous")
),
Col(
"/wfs:FeatureCollection/wfs:member/omso:PointTimeSeriesObservation/om:result/wml2:MeasurementTimeseries/wml2:point/wml2:MeasurementTVP/wml2:time",
Column Name(
"Timestamp"
),
Fill("Use Once"),
Type("Character"),
Format({"Best"}),
Modeling Type("Continuous")
),
Col(
"/wfs:FeatureCollection/wfs:member/omso:PointTimeSeriesObservation/om:result/wml2:MeasurementTimeseries/wml2:point/wml2:MeasurementTVP/wml2:value",
Column Name(
"Value"
),
Fill("Use Once"),
Type("Numeric"),
Format({"Best"}),
Modeling Type("Continuous")
)
),
XML Wizard(0),
"text"
);
For Each Row(dt,
:MeasurementID = Word(-1, :MeasurementID, "-");
:Timestamp = Substitute(:Timestamp, "Z", "");
);
Column(dt, "Timestamp") << Data Type(Numeric) << Modeling Type(Continuous) << Format("yyyy-mm-ddThh:mm:ss", 19, 0);
dt_split = dt << Split(
Split By(:MeasurementID),
Split(:Value),
Group(:Timestamp),
Output Table("FMI " || location),
Sort by Column Property
);
Close(dt, no save);
dt_split << Delete Scripts(dt_split << Get Table Script Names);
gb = dt_split << Graph Builder(
Size(857, 524),
Show Control Panel(0),
Variables(X(:Timestamp), Y(:humidity), Y(:pressure), Y(:temperature)),
Elements(Position(1, 1), Line(X, Y, Legend(15))),
Elements(Position(1, 2), Line(X, Y, Legend(16))),
Elements(Position(1, 3), Line(X, Y, Legend(17)))
);
gb << Save Script to Data Table("Plot");
If you wish to see how I filled XML Wizard, you can change the XML Wizard(0), to XML Wizard(1), and run code until that point. You can then see the settings in the GUI I used. And here is some sort of explanation of what those mean

Vous pouvez aller assez loin en utilisant simplement Tall Guess

Mais il manquera les types de mesure et vous devrez apporter les quelques modifications que j'ai faites pour les répéter sur toutes les lignes (vous pouvez également remplir une fois -> remplir le reste dans le tableau JMP).
Re : Récupérer des données XML vers JMPJ'ai déjà essayé le complément d'importation XML dans JMP, mais je m'y suis perdu, cependant, maintenant, d'après votre explication, je comprends comment cela fonctionne ! @jthi Merci ! De plus, j'apprécie vraiment que vous ayez partagé la façon dont vous avez récupéré ces données en utilisant open(char to blob(), "text") !