ExtractXMLMap is for when working with a string as far as I can tell :
Code: Select all
Xml$ = "<map><element key=" + Chr(34) + "theKey" + Chr(34) + ">the value</element></map>"
If ParseXML(0, Xml$) And XMLStatus(0) = #PB_XML_Success
NewMap Test.s()
ExtractXMLMap(MainXMLNode(0), Test())
ForEach Test()
Debug MapKey(Test()) + " -> " + Test()
Next
Else
Debug XMLError(0)
EndIf
When I was working with XML I had to use much more convoluted methods to load my XML from disk then parse the file myself. I'm not sure if things have gotten easier since then
Code: Select all
Procedure ImportDataFile_XML(*CurrentNode, CurrentSublevel.i)
Protected NodeName.s, *ChildNode, AttributeName.s, FilenameString.s, PictureFileName.s, *Buffer
Protected FileSize.i, PictureFileHandle.i, FileNamesCountLoop.i, FileNamePart.s
Protected FileExtensionPart.s, Separator.s
If XMLNodeType(*CurrentNode) = #PB_XML_Normal
NodeName.s = GetXMLNodeName(*CurrentNode)
;;do stuff With the node data
*ChildNode = ChildXMLNode(*CurrentNode)
While *ChildNode <> 0
ImportDataFile_XML(*ChildNode, CurrentSublevel + 1)
*ChildNode = NextXMLNode(*ChildNode)
Wend
EndIf
EndProcedure
Procedure ImportDataFile()
Protected.i XML
Protected.q ImdbXMLFileSize.q
Protected *Buffer, *Node
ImdbXMLFile.i = ReadFile(#PB_Any, "level.xml")
If ImdbXMLFile.i
ImdbXMLFileSize.q = Lof(ImdbXMLFile.i)
If ImdbXMLFileSize.q
*Buffer = AllocateMemory(ImdbXMLFileSize.q)
If *Buffer
If ReadData(ImdbXMLFile, *Buffer, ImdbXMLFileSize.q) = ImdbXMLFileSize.q
XML = CatchXML(#PB_Any, *Buffer, ImdbXMLFileSize.q)
If XML
*Node = MainXMLNode(XML)
If *Node
ImportDataFile_XML(*Node, 0)
EndIf
FreeXML(XML)
EndIf
EndIf
FreeMemory(*Buffer)
EndIf
CloseFile(ImdbXMLFile.i)
EndIf
EndIf
EndProcedure
ImportDataFile()