尝试在VBScript中添加节点

时间:2017-04-06 14:49:38

标签: xml vbscript

我有一些代码将子节点(HolderAccount)重命名为HolderAccount1和HolderAccount2。某些HolderAccounts可能有一个或两个HolderAccount子节点。我想创建一个新的HolderAccount,其中HolderAccounts中只有一个HolderAccount。

父节点= HolderAccounts
子节点= HolderAccount

输入样本:

<HolderAccounts>
    <HolderAccount>test</HolderAccount>        
</HolderAccounts>

<HolderAccounts>
    <HolderAccount>test</HolderAccount>
    <HolderAccount>test</HolderAccount>
</HolderAccounts>

我的输出:

<HolderAccounts>
    <HolderAccount1>test</HolderAccount1>
    <HolderAccount2/> 
</HolderAccounts>

<HolderAccounts>
    <HolderAccount1>test</HolderAccount1> 
    <HolderAccount2>test</HolderAccount2>
    <HolderAccount2/>       
</HolderAccounts>

我想要完成的任务:

<HolderAccounts>
    <HolderAccount1>test</HolderAccount1>
    <HolderAccount2></HolderAccount2> 
</HolderAccounts>

<HolderAccounts>
    <HolderAccount1>test</HolderAccount1> 
    <HolderAccount2>test</HolderAccount2>                      
</HolderAccounts>
Set xml = CreateObject("Microsoft.XMLDOM")
xml.async = False
count_var = 1

total_accounts = 0
total_modified_accounts = 0

'Get data from directory 
If xml.Load("c:\XML_DATA2.xml") Then
    'Find and give me a list of all HolderAccounts 
    For Each HolderAccounts In xml.SelectNodes("//HolderAccounts")
        'Find and give me a list of all HolderAccount    
        For Each HolderAccount In HolderAccounts.SelectNodes("./HolderAccount")
            'Check to see if you are pointing to 2nd HolderAccount in the HolderAccounts
            If count_var > 1 Then
                'Rename the 2nd HolderAccount in HolderAccounts
                Set accountEnum = xml.createNode(1, "HolderAccount" & count_var, "")

                'Give me the current nodes child nodes 
                For Each child In HolderAccount.childNodes
                    'Attach the child nodes to the account
                    accountEnum.appendChild(child.cloneNode(True))
                Next
                HolderAccounts.replaceChild accountEnum, HolderAccount

                total_modified_accounts = total_modified_accounts + 1
                xml.Save("c:\XML_DATA2.xml")
            Else    '1st HolderAccount 
                'Rename the 1st account 
                Set accountEnum = xml.createNode(1, "HolderAccount" & count_var, "")

                For Each child In HolderAccount.childNodes
                    accountEnum.appendChild(child.cloneNode(TRUE))
                Next
                HolderAccounts.replaceChild accountEnum, HolderAccount 

                'This is returning <HolderAccount2/> for nodes within <HolderAccounts>, 
                'I only want to create a new node where exist one node within <HolderAccounts>
                Set accountEnum2 = xml.createElement("HolderAccount2")
                HolderAccounts.appendChild(accountEnum2)

                xml.Save("c:\XML_DATA2.xml")
            End If
            count_var = count_var + 1
        Next           
        count_var = 1
        total_accounts = 0      
    Next
End If

Set node = Nothing
Set xml  = Nothing

1 个答案:

答案 0 :(得分:1)

我已经简化了一些代码以更好地适应您的逻辑。看起来你已经改变了你的规范来枚举第一个节点,所以我们可以完全摆脱If语句。始终会调用Else块,因为count_var始终从每个HolderAccounts容器的一个开始。

相反,我们只想处理节点下有一个帐户的情况。最里面的循环将复制它,但我们也需要添加新的空HolderAccount节点。

<强>输入

<FabeDole>
    <HolderAccounts>
        <HolderAccount>test</HolderAccount>
    </HolderAccounts>
    <HolderAccounts>
        <HolderAccount>test</HolderAccount>
        <HolderAccount>test</HolderAccount>
    </HolderAccounts>
</FabeDole>

<强>输出

<FabeDole>
    <HolderAccounts>
        <HolderAccount1>test</HolderAccount1>
        <HolderAccount2/>
    </HolderAccounts>
    <HolderAccounts>
        <HolderAccount1>test</HolderAccount1>
        <HolderAccount2>test</HolderAccount2>
    </HolderAccounts>
</FabeDole>

<强>代码

Set xml = CreateObject("Microsoft.XMLDOM")
xml.async = False
count_var = 1

If xml.Load("C:\XML_DATA2.xml") Then
    For Each HolderAccounts In xml.SelectNodes("//HolderAccounts")
        Set HolderAccountCollection = HolderAccounts.SelectNodes("./HolderAccount")

        For Each HolderAccount In HolderAccountCollection

            Set accountEnum = xml.createNode(1, "HolderAccount" & count_var, "")
            For Each child In HolderAccount.childNodes
                accountEnum.appendChild(child.cloneNode(True))
            Next
            HolderAccounts.replaceChild accountEnum, HolderAccount

            count_var = count_var + 1
        Next

        If HolderAccountCollection.Length = 1 Then HolderAccounts.appendChild(xml.createNode(1,"HolderAccount" & count_var,""))
        count_var = 1   
    Next
    xml.Save("C:\XML_DATA2.xml")
End If