Text in XML-Daten

A

alexlaske

Neues Mitglied
Thread Starter
Dabei seit
31.07.2008
Beiträge
15
Reaktionspunkte
0
Hallo,

ich habe folgendes Problem: ich hole mir den Quelltext von einer Abfrage bei geonames.org und erhalte z.B. folgenden String:

"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>
<geonames>
<geoname>
<toponymName>Aoraki Mount Cook</toponymName>
<name>Aoraki Mount Cook</name>
<lat>-43.7370885974461</lat>
<lng>170.099258422852</lng>
<geonameId>6621491</geonameId>
<countryCode>NZ</countryCode>
<countryName>New Zealand</countryName>
<fcl>P</fcl>
<fcode>PPL</fcode>
<distance>3.1762</distance>
</geoname>
</geonames>
"

Dies sind ja saubere XML-Daten. Diese möchte ich nun per AS gerne weiter verarbeiten. Bisher habe ich die Daten immer in eine XML-Datei geschrieben und diese dann wieder ausgelesen. Gibt es eine Möglichkeit den String direkt im Skript in XML-Daten umzuwandeln, so dass ich diese dann über "System Events" auslesen kann?

Vielen Dank im voraus für Eure Hilfe.

Gruß,

Alex
 
Ich versteh die Frage nicht.
Du möchtest XML Datein in XML Daten umwandeln :confused:
 
Hallo maceis,

in der Frage steht doch, dass der Quellcode ein String ist. Ich kann per "System Events" nicht z.B. über "get XML element 1" zugreifen. Diese Abfrage ergibt "<". Das zeigt mir doch, dass AS offensichtlich die Daten eben NICHT als XML-Daten ansieht. Wenn ich diese Daten aber in eine Datei schreibe, die die Endung ".xml" hat und diese dann wieder auslese, gibt mir "get XML element 1" sehr wohl ein Ergebnis, mit dem ich dann weiter arbeiten kann. Anders gefragt: kann ich mit der XML-Suite von System Events Strings, die wie XML-Daten aufgebaut sind, lesen und wenn ja, wie?

Ich hoffe, jetzt wird es deutlicher..
 
Die Farge ist halt sehr missverständlich formuliert:
[...]
und erhalte z.B. folgenden String:
[...]
Dies sind ja saubere XML-Daten.
[...]
Gibt es eine Möglichkeit den String direkt im Skript in XML-Daten umzuwandeln
[..]
:confused:
 
...deswegen habe ich ja nun auch die Klarstellung geschrieben.. Aber ich versuche es noch einmal:

get source of [some url]

Ergebnis:
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>
<geonames>
<geoname>
<toponymName>Aoraki Mount Cook</toponymName>
<name>Aoraki Mount Cook</name>
<lat>-43.7370885974461</lat>
<lng>170.099258422852</lng>
<geonameId>6621491</geonameId>
<countryCode>NZ</countryCode>
<countryName>New Zealand</countryName>
<fcl>P</fcl>
<fcode>PPL</fcode>
<distance>3.1762</distance>
</geoname>
</geonames>
"

get XML element 1 of the result

Ergebnis: "<"

Das ist aber ja nun nicht das erste XML-Element, oder? Nein! Daher schreibe ich per Text Edit ein XML-File, lese es aus und bekomme mit der gleichen Abfrage ein Ergebnis. Z.B. kann ich abfragen: get value of XML element "countryCode" -> "NZ"
Die Frage ist nun, ob ich mir den Zwischenschritt mit dem Datei-erstellen irgendwie sparen kann..
 
Vorschlag:
Poste doch mal Dein Skript komplett bzw. den Teil, mit dem Du Schwierigkeiten hast.
Dann kann man das mal selbst versuchen und nicht nur herumraten.
 
Also, gut. Unten habe ich mal das gepostet, was Probleme macht. Dass das Skript so nicht funktioniert ist klar; dies ist nur ein Auszug aus einem größeren Skript. Aber das ist für meine Frage unerheblich. Also, wie Du siehst, wird der Quellcode in die Variable xml_contents geschrieben und dann an die make_xml_file-Subroutine weitergegeben. Das dort erstellte File wird in der filter-xml_content-Subroutine ausgelesen und bestimmte Werte werden weiter verarbeitet. Ich würde mir gerne den make_xml_file-Handler sparen und direkt mit der Variable xml_contents weiterarbeiten. Ist das möglich? Oder MUSS ich den Zwischenschritt mit der Datei gehen? Wenn es möglich ist, wie? Ich hoffe, jetzt ist die Frage endlich klar..

tell application "Safari" to open location "http://ws.geonames.org/findNearbyPlaceName?lat=-43.728&lng=170.092603333012"
tell application "Safari" to set xml_contents to the source of the front document

(*Ergebnis: "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>
<geonames>
<geoname>
<toponymName>Aoraki Mount Cook</toponymName>
<name>Aoraki Mount Cook</name>
<lat>-43.7370885974461</lat>
<lng>170.099258422852</lng>
<geonameId>6621491</geonameId>
<countryCode>NZ</countryCode>
<countryName>New Zealand</countryName>
<fcl>P</fcl>
<fcode>PPL</fcode>
<distance>1.1433</distance>
</geoname>
</geonames>
"*)

make_xml_file(xml_contents)
filter_xml_content()


on make_xml_file(xml_contents)
tell application "TextEdit"
set this_doc to open for access file doc_path with write permission
delay 1
write "" to this_doc as string
write xml_contents to this_doc as string
close access doc_path as alias
end tell
end make_xml_file

on filter_xml_content()
tell application "System Events"
set xml_data to the contents of XML file [filepath]
tell xml_data to set geonames to XML element "geonames"
tell geonames to set geoname to every XML element
repeat with this_element in geoname
tell this_element
set distanceToLoc to round (get the value of XML element "distance") rounding up
end tell
end repeat
end tell
end filter_xml_content
 
der zugriff über die system events funktioniert offensichtlich nur mit referenzierten files, was in der tat u.U. störend ist.

eine zweite (sehr gute) alternative ist die XMLLib.osax von satimage. weiterer mehrwert: operationen in grösseren XML files sind hiermit um ein vielfaches schneller als der zugriff per system events...
 
Hi Maceis,

vielen Dank für den Tipp. Habe die XML Tools installiert. Allerdings funktioniert das Kommando parse XML bei mir nicht; weder mit meinen Daten noch mit dem Code, der auf der Homepage von Latenight Software steht. Es kommt immer eine Fehlermeldung, dass [...] versteht die Nachricht parse XML nicht. Kannst Du mir da auch weiterhelfen?

Vielen Dank schon mal.
 
Nein leider nicht. Habs beim Googeln gefunden, aber nicht selbst ausprobiert.
 
... Dies sind ja saubere XML-Daten. Diese möchte ich nun per AS gerne weiter verarbeiten. Bisher habe ich ...

ich weiß ja nicht, was du genau mit weiterverarbeiten meinst, aber (vorausgesetzt, die XMLLib von satimage ist installiert) ginge das auslesen des typonymName z.b. SO (KLICK):

set myURL to "http://ws.geonames.org/findNearbyPlaceName?lat=-43.728&lng=170.092603333012"
set myDOC to XMLOpen myURL
set myROOT to XMLRoot myDOC

(XMLGetText (XMLXPath myROOT with "geoname/toponymName")) as text
-- ERGEBNIS: "Aoraki Mount Cook"

XMLClose myDOC]

dabei wird direkt die URL ausgelesen und in den speicher geladen und kann referenziert werden (myDOC). es wird dann im speicher gearbeitet (affig schnell). der XMLClose-befehl gibt den speicher wieder frei. es ist sogar ein xslt-prozessor integriert!
 
  • Gefällt mir
Reaktionen: Olivetti
Zurück
Oben Unten