2017-04-06 1 views
0

자식 노드 (HolderAccount)의 이름을 HolderAccount1 및 HolderAccount2로 바꿉니다. 일부 HolderAccounts에는 하나 또는 두 개의 HolderAccount 자식 노드가있을 수 있습니다. HolderAccount에 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 컨테이너마다 하나씩 시작되므로 항상 Else 블록이 호출되었습니다.

대신 노드 아래에 하나의 계정 만있는 경우를 처리하려고합니다. 가장 안쪽의 루프가 그것을 복사 할 것이지만 새로운 빈 비어있는 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

감사합니다. 그게 내 문제를 확실히 해결했습니다. 독서와 놀기에 몇 시간이 걸렸습니다. (여전히 잘못 이해하고 있습니다.) 잠시 시간이 걸렸습니다. 너에게 좋은 주말! –