XML-Daten nach JMP abrufenHallo, ich versuche, Wetterdaten aus XML (Finnischer Wetterdienst - https://en.ilmatieteenlaitos.fi/open-data-manual-fmi-wfs-services ) so in JMP zu übertragen, dass der Benutzer den Zeitraum festlegen kann. Mein Code funktioniert nicht, ich erhalte immer die Fehlermeldung „Ungültiger HTTP-Anforderungsstatus“.
// 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))
);Automatisierung und SkriptingDatenzugriffBetreff: XML-Daten nach JMP abrufenDie Syntax für die neue HTTP-Anforderung ist falsch. Hier ist ein kleines Beispiel, das einige Daten zurückgeben sollte
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);
*/Betreff: XML-Daten nach JMP abrufenDanke @jthi, die HTTP-Anfrage funktioniert jetzt, aber es scheint, dass auch der Rest des Skripts fehlerhaft ist. Dies ist das erste Mal, dass ich versuche, Daten aus XML abzurufen.
Betreff: XML-Daten nach JMP abrufenEs scheint, als würden Sie LLM-generierten Code verwenden? Wenn ja, sind sie meiner Meinung nach mit JSL schrecklich.
Ich würde vorschlagen, dass Sie die resultierenden Daten als XML-Datei speichern und die Vorschau von JMP verwenden, um das Quellskript zu erhalten

Dies erfordert etwas Herumprobieren, kann aber damit analysiert werden (oder es können XPath Query() oder Parse XML() verwendet werden).

Sie können dann das Quellskript verwenden, um Ihren Prozess weiter zu automatisieren, und Sie können am Ende etwas wie


Betreff: XML-Daten nach JMP abrufen
Betreff: XML-Daten nach JMP abrufenUnten ist das Skript, das ich verwendet habe (ich habe früher offene Daten von Ilmatieteenlaitos in JMP verwendet, aber ich glaube, ich habe entweder andere Daten verwendet oder sie auf eine etwas andere Weise analysiert). Es verwendet einige fortgeschrittenere Techniken wie open(char to blob(), "text"), aber das kann vermieden werden, indem man die Datei zuerst einfach als Textdatei speichert. Es verfügt auch über eine Datenbereinigung und Diagrammerstellung (überprüfen Sie, ob die erstellten Daten korrekt sind, ich habe diesbezüglich keine Prüfungen durchgeführt).
Mehr sehen...
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

Sie können ziemlich weit kommen, indem Sie einfach Tall Guess verwenden

Allerdings fehlen die Maßarten und Sie müssen die wenigen Änderungen vornehmen, die ich vorgenommen habe, um sie in allen Zeilen zu wiederholen (Sie könnten auch einmal ausfüllen -> Rest in der JMP-Tabelle ausfüllen).
Betreff: XML-Daten nach JMP abrufenIch habe das XML-Import-Add-In in JMP schon einmal ausprobiert, war damit aber überfordert. Dank Ihrer Erklärung verstehe ich jetzt jedoch, wie es funktioniert! @jthi Danke! Außerdem finde ich es wirklich toll, dass Sie uns mitgeteilt haben, wie Sie diese Daten mit open(char to blob(), "text") abgerufen haben!