VST
VST

Reputation: 131

Write XML string directly to XML file with VBScript

My OS is Windows 7 64Bit. I need to write the following XML string along with interpreted dynamic content to an XML file (also maintaining the tabs indentation) by using VBScript:

File Name: [Variable1]_[Variable2].xml

<?xml version="1.0"?>
<config>
    <modules>
        <[Variable1]_[Variable2]>
            <active>true</active>
            <codePool>[Variable3]</codePool>
            <version>[Variable4]</version>
        </[Variable1]_[Variable2]>
    </modules>
</config>

All I could try for that is below script to create various tags and elements one-by-one.

scriptDir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
Set xmlDoc = CreateObject("Msxml2.DOMDocument.3.0")
Set objRoot = xmlDoc.CreateElement("config")
xmlDoc.AppendChild objRoot
Set objRecord = xmlDoc.CreateElement("modules")
objRoot.AppendChild objRecord
Set objName = xmlDoc.CreateElement("Mageweb_ShippingFilter")
objName.Text = ""
objRecord.AppendChild objName
Set objDate = xmlDoc.CreateElement("AuditDate")
objDate.Text = Date
objRecord.AppendChild objDate
Set objIntro = xmlDoc.CreateProcessingInstruction("xml", "version='1.0'")
xmlDoc.InsertBefore objIntro, xmlDoc.ChildNodes(0)
'For now there is static name of file
xmlDoc.Save scriptDir & "\Testfile.xml"

But this seems to be too cumbersome for possibly large XML files in future, so can I just write the above XML string (with all variables interpreted with their relevant values) I mentioned, directly to XML file and then give a variable-based dynamic name with VBScript?

Upvotes: 0

Views: 6739

Answers (2)

Mithilesh Indurkar
Mithilesh Indurkar

Reputation: 489

See if this helps

Set xmlDoc = CreateObject("Msxml2.DOMDocument.3.0")

xmlDoc.LoadXML strXML 'strXML being your xml string

xmlDoc.Save strPath 'Directory and name of the save location

For this method to work, the strXML variable should have the variables interpreted beforehand. You may use the string methods to achieve that.

P.S. i have written this snippet on a phone and may have some errors but that should give a way ahead.

Upvotes: 0

Ekkehard.Horner
Ekkehard.Horner

Reputation: 38745

In general, XML data should be processed with XML tools (DOM manipulation, XSLT), exactly because those methods tend to scale better when the size/complexity of the problem grows.

But for special cases (e.g. ASCII encoding, foolproof marking of the replacements) using a RegExp replace function and a dictionary may solve a templating task efficiently (see here).

Demo code:

Option Explicit

Function fnRepl(sM, nP, sS)
  fnRepl = gdX(sM)
End Function

Function mkDic(aK, aV)
  Dim tmp : Set tmp = CreateObject("Scripting.Dictionary")
  Dim i
  For i = 0 To UBound(aK)
      tmp(aK(i)) = aV(i)
  Next
  Set mkDic = tmp
 End Function

Dim gdX : Set gdX = mkDic( _
     Split("[Variable1] [Variable2] [Variable3] [Variable4]") _
   , Split("abra cada bra sesame") _
) 
Dim r : Set r = New RegExp
r.Global = True
r.Pattern = "\[[^\]]+\]" 
Dim sT : sT = Join(Array( _
      "<?xml version=""1.0""?>" _
    , "<config>" _
    , " <modules>" _
    , "  <[Variable1]_[Variable2]>" _
    , "   <active>true</active>" _
    , "   <codePool>[Variable3]</codePool>" _
    , "   <version>[Variable4]</version>" _
    , "  </[Variable1]_[Variable2]>" _
    , " </modules>" _
    , "</config>" _
    ), vbCrLf)

WScript.Echo sT
WScript.Echo "----------"
WScript.Echo r.Replace(sT, GetRef("fnRepl"))

output:

cscript 45553911.vbs
<?xml version="1.0"?>
<config>
 <modules>
  <[Variable1]_[Variable2]>
   <active>true</active>
   <codePool>[Variable3]</codePool>
   <version>[Variable4]</version>
  </[Variable1]_[Variable2]>
 </modules>
</config>
----------
<?xml version="1.0"?>
<config>
 <modules>
  <abra_cada>
   <active>true</active>
   <codePool>bra</codePool>
   <version>sesame</version>
  </abra_cada>
 </modules>
</config>

Upvotes: 1

Related Questions