2017-04-06 19 views
0

子ノード(HolderAccount)の名前をHolderAccount1とHolderAccount2に変更するコードがあります。一部のHolderAccountには、1つまたは2つのHolderAccount子ノードが含まれている場合があります。私はHolderAccountに1つのHolderAccountしかない新しいHolderAccountを作成したいと思います。VBScriptにノードを追加しようとしています

親ノード= HolderAccounts
子ノード= HolderAccount

入力サンプル:

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

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

マイ出力:

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

<HolderAccounts> 
    <HolderAccount1>test</HolderAccount1> 
    <HolderAccount2>test</HolderAccount2>      
</HolderAccounts> 
:私が達成しようとしています何

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

<HolderAccounts> 
    <HolderAccount1>test</HolderAccount1> 
    <HolderAccount2>test</HolderAccount2> 
    <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

番号付きノード名「どんな問題あなたに欠陥のあるアプローチですここではIMOを解決しようとしています。あいまいな理由のために、ノードにインデックスを絶対に付けなければならない場合は、それらにインデックス属性を追加するだけです。 –

+0

新しい要素ノードを作成し、新しい空のテキストノードを接続します。 – omegastripes

+0

@Ansgar - あなたのアプローチは何ですか?なぜこれは欠陥のあるアプローチですか?興味深い...応答してくれてありがとう! –

答えて

1

あなたのロジックに合わせてコードを単純化しました。最初のノードを列挙するように仕様を変更したようですので、Ifステートメントを完全に取り除くことができます。 count_varは常にHolderAccountsコンテナごとに1つずつ開始されているため、ブロックElseが常に呼び出されていました。

代わりに、ノードの下に1つのアカウントがある場合のみを処理したいとします。最も内側のループがコピーしますが、新しい空の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 
+0

@FabeDole:問題はありません。コードを少し編集する必要がありました&あなたのコードが余分な 'HolderAccount2'を作成していた理由を理解するのに役立つ小さな説明を追加しました –

+0

ありがとうございました。それは間違いなく私の問題を解決しました。私に数時間かけて読んで遊んでいた(それでも間違っていた)のが分かりました。あなたに素晴らしい週末! –

関連する問題