问题
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