Wenn man, wie ich, häufiger per AutoIt Webseiten oder XML-Dokumente mit AutoIt verarbeiten muss, so landet man irgendwann entweder bei den Browser-basierten UDFs oder den auf Microsoft.XMLDOM-basierenden Lösungen.
Da ich mit beiden nicht 100% zufrieden bin und vor allem da ich es also ultimative Herausforderung für mich betrachtet habe, habe ich mich mal rangesetzt und einen XML-Parser in reinem AutoIt (+ Dictionary-Objekt) geschrieben.
Das Konzept sieht vor, dass ein XML (bzw. XHTML oder HTML)-String in verschachtelte AutoIt-Strukturen (quasi ein DOM) zerlegt wird. Jede Ebene der Struktur besteht aus einem 2D-Array in welchem die Zeilen die einzelnen Elemente darstellen und in 3 Spalten folgende Infos zu finden sind: [0]: Elementtyp [1]:Attribute+Werte als Dictionary [2]:Elementinhalt als Sub-DOM oder als String.
Da man mit einem DOM alleine nicht viel anfangen kann, benötigt man noch eine effektive Abfragesprache. Ich habe mich für CSS-Selektoren entschieden da ich mit diesen besser klarkomme als z.B. mit XPath.
Mittlerweile hab ich hierbei einen Stand erreicht, den ich als vorzeigbar einschätze, was ich hiermit dann auch tun möchte.
Wie funktionierts? - am besten wie immer am Beispiel:
#include <XML.au3>
; ================= XML-String holen =======================================
Local $s_XML_String = BinaryToString(InetRead("https://de.wikipedia.org/"))
; ================= XML-String in AutoIt-Datenstruktur parsen ==============
Local $a_DOM = _XML_Parse($s_XML_String)
; ================= einzelne Elemente per CSS-Selektoren ermitteln =========
; Ermittelung des Artikels des Tages bei Wikipedia
Local $a_Elements = _CssOnDOM($a_DOM, '#mf-tfa p a:first')
Local $s_Threadname = $a_Elements[0][2]
Local $s_Link = $a_Elements[0][1]("href")
MsgBox(0, "Artikel des Tages", $s_Threadname & @CRLF & @CRLF & 'https://de.wikipedia.org' & $s_Link)
; ================= DOM-Struktur in XML-String konvertieren ==============
Local $a_DOM_Temp = _CssOnDOM($a_DOM, 'head')
Local $s_XML_Generated = _XML_Generate($a_DOM_Temp)
ConsoleWrite($s_XML_Generated)
Alles anzeigen
Zum Stand: Alles was ich implementieren wollte, habe ich auch implementiert.
Es fehlen jedoch umfangreiche Tests und daher werde ich mich streng hüten die UDF als Beta oder Final zu bezeichnen.
Eventuell bringt es dem einen oder anderen aber bereits jetzt etwas.