COM error 80020009

  • Hallo zusammen


    ich hab ein Script gebastelt, welches über eine API von search.ch den Telefonbucheintrag einer Telefonnummer ausgeben soll. Die Resultate werden von der API als xml-Datei geliefert. Doch ich erhalte den Fehler

    We intercepted a COM Error ! Number is: 80020009 Windescription is: Ausnahmefehler aufgetreten.

    Leider scheint diese Meldung nichts spezifisches auszusagen, offenbar hat es aber mit dem API-Aufruf zu tun, das konnte ich als einzigstes rausfinden.


    Vielleicht hat hier jemand eine Idee, woran das liegen könnte? Ist der Befehl _XMLCreateFile() evtl. der falsche in diesem Fall?

    Eine Beispiel-xml-Datei kann ansonsten hier gefunden werden: Link

    Danke für einen Tipp!


  • Wie die gelieferte xml-Datei aussieht, hängt ganz davon ab, welche Parameter du bei der Suchanfrage übergibst.


    Hier mal eine einfache Anfrage...


    und hier die gelieferte xml-Datei...

  • Vielen vielen Dank Bitnugger ! Das Ganze funktioniert nun tiptop, habs sogar geschafft, auch noch eine allfällige Faxnummer anzeigen zu lassen, die ja in einem anderen Node angegeben wird.


    Noch eine kleine Frage: Die xml-Datei wird ja offenbar lokal abgespeichert, diese wird vermutlich nicht gelöscht, wenn das Script zu Ende ist, oder? Aber ich vermute auch, da die xml-Datei stets den gleichen Namen hat, wird eine alte Datei überschrieben bei einer neuen Anfrage, daher wirds nicht so dramatisch sein, ist das so korrekt?

  • Hallo bigeasy76

    Nein, hier wird nichts überschrieben. Siehst du nicht, dass Bitnugger eine Prüfung eingebaut hat, ob die Datei bereits vorhanden ist, und sie nur lädt, wenn das nicht der Fall ist?

    (Wenn du keine Datei brauchst könntest du den ganzen Inetget und FileRead Block auch entfernen und Local $sXML = BinaryToString(InetRead($sURL, 1)) schreiben.

  • Du könntest es z.B. auch so machen...

    api-response.png


    ...du könntest aber auch die Ergebnisse der (erfolgreichen) Suchen (mit Datum) in eine Ini-Datei speichern und diese dann vor der nächsten Anfrage bei tel.search.ch auswerten, bzw. falls bereits ein Eintrag vorhanden ist, danach fragen, ob dieser angezeigt, oder ob eine erneute Suchanfrage gestellt werden soll. Im Prinzip stehen dir alle Wege offen... es kommt halt darauf an, war du mit den Ergebnissen der Suche machen willst.


    autoiter

    Ich denke, er möchte wissen, ob die Datei überschrieben wird (ja), wenn er eine neue Anfrage abschickt und die Datei bereits vorhanden ist, oder ob die neuen Daten an die bereits vorhanden angefügt werden, oder ob evtl. gar nichts passiert.

  • Beitrag von autoiter ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Bitnugger

    Ich denke, er möchte wissen, ob die Datei überschrieben wird (ja)

    Die Datei wird aber nicht gelöscht, oder?

    Code
    1.     If FileExists('api-response.xml') Then
    2. ConsoleWrite('! api-response.xml war bereits vorhanden' & @CRLF)
    3. Else
    4. If Not InetGet($sURL, 'api-response.xml', 1) Then Return False
    5. ConsoleWrite('! api-response.xml wurde soeben gespeichert' & @CRLF)
    6. EndIf
  • Ich denke, er möchte wissen, ob die Datei überschrieben wird (ja)

    Die Datei wird aber nicht gelöscht, oder?

    autoiter

    Stimmt, ist die Datei 'api-response.xml' bereits vorhanden, dann wird ihr Inhalt angezeigt. Sie wird weder gelöscht noch überschrieben noch aktualisiert.


    Gruß Musashi

    "Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten." - Albert Einstein

  • Vielen Dank Bitnugger   autoiter & Musashi für die wie immer tolle Hilfe!

    Im ersten Schritt soll nur eine Abfrage einer Telefonnummer durchgeführt werden und das Resultat in einem html-String zurückgegeben werden. Das funktioniert nun auch tiptop.

    Später sollen dann noch Abfragen von Namen und/oder Adressen dazukommen, dann werden ja mehrere Resultate in der xml-Datei geliefert. Dort gibts ja dann jeweils mehrere Knoten mit denselben Namen.


    So wie ich das rausfinden konnte, kann ich diese Knoten dann nicht direkt über xml ansprechen, sondern muss im Script eine Abfrage machen, dass nur zb. Daten des Knoten so&so, wo id = so&so ist, erfasst werden. Ist das so korrekt oder gibts da doch eine elegantere Lösung?

  • So wie ich das rausfinden konnte, kann ich diese Knoten dann nicht direkt über xml ansprechen, sondern muss im Script eine Abfrage machen, dass nur zb. Daten des Knoten so&so, wo id = so&so ist, erfasst werden. Ist das so korrekt oder gibts da doch eine elegantere Lösung

    Knoten = Node


    Das ginge, wenn du in einem ersten Durchlauf die IDs aus der response.xml ausliest.


    Schau mal hier... vielleicht bringt dich das auf den rechten Weg...

  • Vielen Dank Bitnugger ! Bei Deinem Beispiel ist mir zwar noch vieles unklar, da ich ja noch ein Anfänger bin, aber das merkt man wohl.


    Edit: Hab da Blödsinn erzählt, es funktioniert doch, nur hatte ich bei den ersten Versuchen einen Suchbegriff verwendet, der keine Resultate ergab.



    Ich hab hier nun noch die Abfrage der URL eingefügt, aber nun läuft das Script offenbar nur bis ConsoleWrite('! api-response.xml wurde soeben gespeichert' & @CRLF) , was in der Konsole noch angezeigt wird, dann passiert nichts mehr und das Script beendet. Da ist mir noch nicht klar, wieso das dort nicht weiterläuft. Und vermutlich ist es auch wieder unprofessionelles Gebastel, nicht wahr? :)


    Roli von Gunten

    << Alles Gute kommt von Gunten >>

    Einmal editiert, zuletzt von bigeasy76 ()

  • Das hier läuft bei mir wie es soll... kann allerdings nur ohne API-Key testen. Den musst du noch eingeben, wenn du mit abfragen willst, um detaillierte Informationen (/feed/entry/tel:.*) zu bekommen!

  • Toll, vielen Dank, das geht bei mir auch und langsam kapier ich das script selber auch ein bisschen. Vielleicht darf ich noch folgendes fragen:

    Bei der Ausgabe werden ja stets die Knotennamen als Beschreibung verwendet, so wie tel:street. Wäre es möglich, jedem dieser Knotennamen eine Beschreibung wie hier "Strasse" hinzuzufügen, so dass ich bei der html-Ausgabe eine schöne Tabelle erstellen könnte, die in der ersten Spalte statt Knotennamen gleich die zugehörige Beschreibung anzeigt? Ich hab nicht den geringsten Schimmer, wie ich das angehen könnte, ausser evtl. mit Arrays. Da ich bei Deinem Script aber noch vieles nicht verstehe, wüsste ich nicht, wo ansetzen.

  • Wäre es möglich...

    Ja, das ist möglich.


    Hier noch mal eine letzte Version...

  • Nochmals vielen Dank, verstehe das nun immer besser. Im Array $aTel[1][13] auf Linie 86 muss offenbar jeder der Werte einen Inhalt haben. Da Kanton bei uns weniger wichtig, habe ich tel:canton mit tel:extra type="Fax" ersetzt. Doch leider ergibt das stets den Fehler oXML Error auf Linie 109. Auch wenn ich eine Suche anwende, die sicher eine Faxnummer enthält, kommt derselbe Fehler. Eine Faxnummer gibts ja nicht bei jedem Eintrag.

  • Hi Bitnugger !


    Kurze Frage zur deiner Version aus Beitrag #15 :


    Func _Example_1()

    Local $was = "UBS Zürich"

    $g_sResponse = 'api-response_was=' & $was & '.xml'

    => Der Name der XML-Datei lautet folglich : api-response_was=UBS Zürich.xml


    In der Func _Example_2() wird aber noch der feste Dateiname aus einer älteren Version besetzt :

    $g_sResponse = 'api-response-example.xml' ; Datei muss im Scriptverzeichnis vorhanden sein!

    Hier müsste sicher auch api-response_was=UBS Zürich.xml verwendet werden, oder ?


    Gruß Musashi

    "Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten." - Albert Einstein

  • Da Kanton bei uns weniger wichtig, habe ich tel:canton mit tel:extra type="Fax" ersetzt.

    In das Array $aTel sollen die Namen der Knoten rein, die du ausgewertet haben willst... und du hast es auch fast richtig gemacht.


    Allerdings darfst du anstelle tel:canton nicht tel:extra type="fax" schreiben, sondern nur tel:extra, weil dem Knoten mit type lediglich das Attribut  "fax" zugewiesen wird und dieser Teil somit nicht mehr zum Namen des Knoten gehört.


    Das Script bricht mit einem COM ERROR ab, weil es (noch) keinen COM ERROR HANDLER gibt und in dem Array $aTel für jeden Knoten jeweils nur ein Wert gespeichert wird, tel:extra aber mehrere hat - daran hatte ich gar nicht gedacht.


    Heute habe ich aber keine Energie mehr, um noch was zu machen und morgen bin ich zum Brunch eingeladen... danach werde ich den Rest des Tages durch Alkohol bedingte Unfähigkeit glänzen... komme also frühestens Fr. dazu, mich wieder damit zu befassen.


    Musashi

    Das erste Example war dazu gedacht, eine Anfrage ohne API-Key zu machen, das zweite mit API-Key. Ich habe aber kein API-Key und werte deshalb im zweiten Example die manuell heruntergeladene api-response-example.xml aus, die hier als Beispiel bereitgestellt wird. 8o

  • Bin inzwischen soweit, dass ich mit tel:extra[type=„Fax“] (sorry, da vom Tablet geschrieben die falschen Anführungszeichen) das Script wieder zum Laufen gebracht habe. Jedoch wird alles bis auf die Faxnummer angezeigt, da bin ich noch nicht dahintergekommen, wieso das so ist. Es ist aber sicher eine Faxnummer da.