Write XML string directly to XML file with VBScript

ⅰ亾dé卋堺 提交于 2019-12-12 04:15:22

问题


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?


回答1:


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>



回答2:


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.



来源:https://stackoverflow.com/questions/45553911/write-xml-string-directly-to-xml-file-with-vbscript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!