readXML()

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

readXML()

09 Feb 2022, 08:31

Moin Leuts,
basierend auf dem script von @TheDewd (welches hier bereits erwähnt wurde), (m)ein Versuch eines XMLtools, abseits der im Forum bereits verfügbaren XML-parser-Boliden. Die/eine Test-Datei ist :arrow: hier aus dem verlinkten Thread zum Download verfügbar.
Der Scriptverlauf sollte soweit selbst erklärend sein.

8-)

Code: Select all

#NoEnv
#SingleInstance, Force
SetWorkingDir, A_ScriptDir

nodes :=["AgencyId"															; 'nodes'-array-object that contains all nodes of interest.
		,"IncidentDateTime"
		,"RunReportNarrative"
		,"StreetAddress"
		,"City","State"
		,"ZipCode"
		,"GpsLocationLatitude"
		,"GpsLocationLongitude"
		,"CrossStreet"
		,"TypeOfServiceRequested"]

FileRead, XMLData															; XML document that'll be parsed
		, FLOWMSP_202057dd_0757.xml

Random, No, 1, nodes.Count()												; get random array-object position for testing
value := xmlRead(XMLData,nodes[No])											; request a single (random) nodes' value (for testing, see 'nodes'-array-object above)
MsgBox % nodes[No] " : " value[nodes[No]]

value := xmlRead(XMLData,"AgencyId")										; requesting the value of the 'AgencyId' node without using a preset 'nodes'-array-object  	
MsgBox % value["AgencyId"]													

value := xmlRead(XMLData,nodes)												; requesting the 'value'-array-object for all values
for k, v in value															; "for every key/node take its value that's in the 'value'-array-object"
	lst .= k " : " v "`n"													; creating a 'key : value' list
MsgBox % lst																

xmlRead(XMLData,nodes,occ:=1) {
	value := {}
	(IsObject(nodes)=1) ? nodes : nodes := [nodes]							; create 'single node' array-object if a preset 'nodes'-array-object isn't used.
	for pos, node in nodes {
		RegExMatch(XMLData, "s)<" . node . ">(.*?)<\/" . node . ">", res)
		value[node] := res%occ%
		}
	Return value
	}

Eine (noch offene) Herausforderung (basierend auf der Ausgestaltung der RegExMatch()-Prozessierung) die Erfassung von Mehrfachnennungen von nodes AKA subpatterns. Dat krieschichnich jebacken :crazy:
just me
Posts: 9508
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: readXML()

10 Feb 2022, 11:03

Moin BoBo,

Code: Select all

RegExMatch(XMLData, "s)<" . node . ">(.*?)<\/" . node . ">", res)
hat nur 1 Subpattern (.*?). Dieser Treffer wird damit immer in res1 stehen.

Wenn man mehrere Treffer mit einer identischen Needle sucht, macht man das normalerweise in einer Schleife und Angabe des Suchbeginns:

Code: Select all

ResArr := []
ResArr[Node] := []
Pos := 1
Res := ""
While (Pos := RegExMatch(XMLData, "s)<" . Node . ">(.*?)<\/" . Node . ">", Res, Pos + StrLen(Res)) {
	ResArr.Node.Push(Res1)
}
C :=  ResArr[Node].Length()
For I, V In ResArr[Node]
   MsgBox, 0, Match  %I % of %C% for %Node%, %V%
*ungetestet*

Return to “Skripte und Funktionen”

Who is online

Users browsing this forum: No registered users and 3 guests