阅读带有子节点的完整XML节点,并使用VBS写入另一个XML文件

时间:2012-05-02 21:03:28

标签: xml vbscript xml-parsing

我每天从第三方服务收到2个XML文件,我需要使用VBS将它们组合在一起,因为它是服务器上唯一使用XML的可用技术。每个XML文件都具有相同的结构 -

<section>
    <lot>
        <number>8</number>
        <identifier>au23-zx78a</identifier>
    </lot>
    <lot>
        <number>23</number>
        <identifier>au23-zx78a</identifier>
    </lot>
    ...and so on...
</section>

我需要从文件1中取出所有批次节点(包括任何和所有子节点)并将它们插入到文件2中,然后再保存文件2以供其他服务使用。使用VBS。

我搜索了网页,我找到了使用VBS获取节点的方法,但是我将节点放入另一个文件时迷失了方向。我今天已经编写并删除了3或4个脚本,因为我无法正确使用它。

我知道逻辑就是这个 -

加载文件1, 加载文件2, 从文件1中获取批次节点, 循环遍历文件1中的批次节点,并将它们作为文件2中节节点的子节点附加, 保存文件2

有人能指点我正确的方向来帮助我吗?

2 个答案:

答案 0 :(得分:1)

这是一种简单的方法:将两个xml文件加载到MSXML2.DomDocument个对象中,从第一个文档中选择所有lot个节点,克隆它们并将它们插入到第二个文档中。

option explicit

' collect xml file paths from the command line
dim xmlpath1: xmlpath1 = WScript.Arguments(0)
dim xmlpath2: xmlpath2 = WScript.Arguments(1)

' open up the xml files, this might need some error handling
dim xmldoc1: set xmldoc1 = CreateObject("MSXML2.DomDocument")
xmldoc1.async = false
xmldoc1.load xmlpath1
xmldoc1.setProperty "SelectionLanguage", "XPath"
dim xmldoc2: set xmldoc2 = CreateObject("MSXML2.DomDocument")
xmldoc2.async = false
xmldoc2.load xmlpath2

' get a collection of lot nodes
dim lots: set lots = xmldoc1.selectNodes("/section/lot")
' loop through each lot, clone it and add it to the second document
dim lot
for each lot in lots
    dim l: set l = lot.cloneNode(true)
    xmldoc2.documentElement.appendChild l
next

' overwrite the second document
xmldoc2.save xmldoc2.url

脚本(如果称为merge-xml.vbs)将从命令行运行

  

cscript merge-xml.vbs xml1.xml xml2.xml

答案 1 :(得分:0)

只想提供vbscript示例,了解我如何读取无限制的XML文件克隆内容并创建新的XML文件,然后将其读入记录集。即将多个XML文件读入记录集。

Dim xmlDoc,cn,fso,f,xmlDoc2,rs
    Set cn = CreateObject("ADODB.Connection")   
    Set rs = CreateObject("ADODB.Recordset")  
    Set xmlDoc = CreateObject("MSXML2.DOMDocument.3.0")
    Set xmlDoc2 = CreateObject("MSXML2.DOMDocument.3.0")
    Set fso = CreateObject("Scripting.FileSystemObject")
    xmlDoc.async="False"
    xmlDoc2.async="False"
    xmlDoc2.setProperty "SelectionLanguage","XPath"

    ' Create a root element in the new merged xml
    Set objRoot = xmlDoc.createElement("OutDelData")  
    xmlDoc.appendChild objRoot  

    ' Loop all xmls in a folder and extract all OutDelData/OutDeliveries 
     'change the xpath to //* to clone it all
     For Each f In 
     fso.GetFolder("C:\inetpub\wwwroot\HandheldWebService\data\OutDel\ToDeliver").Files
 If LCase(fso.GetExtensionName(f))="xml" Then
    xmlDoc2.load f.Path     
        For Each node In xmlDoc2.selectNodes("//OutDelData/OutDeliveries/*")
            Set newnode = node.cloneNode(True)
            xmlDoc.documentElement.appendChild newnode
        Next

End If
    Next

    ' Create new xml header
    Set objIntro = xmlDoc.createProcessingInstruction ("xml","version='1.0'")  
    xmlDoc.insertBefore objIntro,xmlDoc.childNodes(0) 

    ' save the nw merged file
    xmlDoc.save "C:\temp\XML\temp.xml"

    ' Open connection and make use of the data in a data set
    cn.Open "Provider=MSDAOSP;Data Source=MSXML2.DSOControl.3.0"
    rs.Open "C:\temp\XML\temp.xml",cn,3,3
    Debug.WriteLine rs.GetString
    rs.Close