Generating text file from XML template (QTP, VBScript)
Parent page: Service Functions – System (QTP, VBScript)
Description
If you need to generate text file with values you don’t know ahead you may do it dynamically, by utilizing the function below. Make sure you designed template first.
The current logic is oriented to executable text files generation, like Dexterity Macro or OS Shell batch files. Code lines are data-driven, if data not supplemented then the line will be omitted.
You may change the logic and extend the functionality as you need.
Function Libraries
Service Functions – XML (QTP, VBScript)
Service Functions – String (QTP, VBScript)
Generate Text File
Public Function GenerateTextFile(ByVal sXMLPattern, ByVal sOutputFile) Dim boolRC Dim FSO Dim objXMLPattern, objRoot Dim objOptions, sDefaultWrap Dim objTextLines, objTextLine, objDataSet, objDataNode Dim objTextFile Dim Iter, sType, sText, boolDatadriven, boolActiveLine, sWrap Dim Jter, sToken, sValue, sLine 'Verify source files exist Set FSO = CreateObject("Scripting.FileSystemObject") boolRC = FSO.FileExists(sXMLPattern) If Not boolRC Then GenerateTextFile = FALSE Set FSO = Nothing Exit Function End If 'Open XML pattern Set objXMLPattern = XMLUtil.CreateXMLFromFile(sXMLPattern) Set objRoot = objXMLPattern.GetRootElement() 'Get options node Set objOptions = ChildElementByName(objRoot, "Options") sDefaultWrap = ChildAttributeValueByName(objOptions, "wrap") Set objTextLines = objRoot.ChildElementsByPath("./Line") 'Rewrite output file Set objTextFile = FSO.CreateTextFile(sOutputFile, TRUE) 'Generate and write text lines in loop For Iter=1 To objTextLines.Count Set objTextLine = objTextLines.Item(Iter) sType = ChildAttributeValueByName(objTextLine, "type") sText = ChildAttributeValueByName(objTextLine, "text") Select Case LCase(sType) Case "comment" objTextFile.WriteLine(sText) Case "code" boolDatadriven = InitBool(ChildAttributeValueByName(objTextLine, "data-driven"), FALSE) If boolDatadriven Then Set objDataSet = objTextLine.ChildElementsByPath("./Data") boolActiveLine = TRUE sLine = sText 'Generate text line For Jter=1 To objDataSet.Count Set objDataNode = objDataSet.Item(Jter) 'Parameter name sToken = Trim(ChildAttributeValueByName(objDataNode, "name")) If sToken = "" Then boolActiveLine = FALSE Exit For End If 'Data value 'Note. You may use any Data Model here: Array, Dictionary, DataTable object, Environment object, etc. sValue = ' - data source according to your data model - provide value based on token retrieved If sValue = "" Then boolActiveLine = FALSE Exit For End If 'wrapping chars sWrap = ChildAttributeValueByName(objDataNode, "wrap") If sWrap = "" Then sWrap = sDefaultWrap End If 'Substitute data sLine = Replace(sLine, "%"&sToken, sWrap & sValue & sWrap) Next 'Save new line if applicable If boolActiveLine Then objTextFile.WriteLine(sLine) End If Else objTextFile.WriteLine(sText) End If Case Else 'ignore. do nothing End Select Next objTextFile.Close() Set FSO = Nothing Set objXMLPattern = Nothing GenerateTextFile = TRUE End Function
One response to "Generating text file from XML template (QTP, VBScript)"
How can I get FSO to read from xml file?
[ Albert’s Reply: you can read it as a text file but you won’t get XML DOM created. ]