我有一些代码将子节点(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
答案 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