2016-06-06 4 views
0

안녕하세요.
저는 powershell을 사용하여 XML의 값 (이름)을 CSV의 가짜 이름으로 바꿉니다. Real.xml (요소 스타일)과 Fake.csv의 두 파일이 있습니다.XML 파일의 요소 값을 CSV의 값으로 바꿉니다.

<?xml version="1.0"?> 
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Node1> 
    <Node2> 
     <Element1>blahblahblah</Element1> 
     <Element2>blahbablahba</Element2> 
     <Node3> 
     <Node4> 
      <ElementIWannaChange>Cena, John</ElementIWannaChange> 
      <Element4>2016-02-11T09:04:15</Element4> 
     </Node4> 
     </Node3> 
    </Node2> 
    </Node1> 
</Data> 

Fake.csv는 다음과 같습니다 :
Real.xml이 같이 보입니다

ID,Fake_first_name,Fake_last_name,First_Name,LastName 
16,Sommer,Agar,John,Cena 
13,Steve,Hanson,Ben,Cook 
103,Bill,Nye,Lynley,Dove 

싶습니다 최종 결과는 PowerShell을 실제 이름을 대체 XML을 통해 갈 것입니다 CSV의 해당 위조 된 이름으로 위의 데이터를 제공 한 예 (Cena, John은 Agar, Sommer로 바뀜).

이것은 내가 지금까지 가지고있는 것입니다.

#This script takes the contents of the XML and exchanges the names in order that they appear with names from a CSV in the order that they appear. 

#XML 
$XMLpath = "D:\Temp\Real.xml" 
$XMLnewPath = "D:\Temp\Replaced-Real.xml" 
$XMLcontents = [XML] (Get-content $XMLpath) 
$Node = $XMLcontents.SelectNodes("/Data/Node1/Node2/Node3/Node4/ElementIWannaChange") 

#CSV 
$CSVpath = "D:\Temp\Fake.csv" 
$CSVcontents = Import-Csv $CSVpath 

$i = 0 

foreach($individual in $Node) 
{ 
    $field2 = $CSVcontents[$i].first_name 
    $field3 = $CSVcontents[$i].last_name 
    $individual.'#Text' = "$field3, $field2" 
    $i++ 
} 
$XMLcontents.Save($XMLnewPath) 
+1

그런 다음 스크립트를 추가하십시오.이 질문은 현재 요청의 것이지만 문제를 해결하는 것이 아닙니다. . –

+0

샘플이 여기에 섞이지 않았습니까? csv의'Fake_first_name'은 "진짜"XML의 값과 같습니다. XML에'Cena, John'이 있어야하지 않나요? –

+0

예, 맞았습니다. 죄송합니다. – waylander232

답변

0

루프 + 색인은 줄에 임의의 이름 만 배치하므로 여기서는 도움이되지 않습니다. 실제 이름 별 특정 위조 이름이있는 경우 매번 일치 항목을 검색해야합니다.

#XML 
$XMLpath = "D:\Temp\Real.xml" 
$XMLnewPath = "D:\Temp\Replaced-Real.xml" 
$XMLcontents = [XML] (Get-content $XMLpath) 
$Node = $XMLcontents.SelectNodes("/Data/Node1/Node2/Node3/Node4/ElementIWannaChange") 

#CSV 
$CSVpath = "D:\Temp\Fake.csv" 
$CSVcontents = Import-Csv $CSVpath 


foreach($individual in $Node) 
{ 
    $last, $first = $individual.'#text' -split ',' 

    $csvitem = $CSVcontents | Where-Object { ($_.First_Name -eq $first.Trim()) -and ($_.LastName -eq $last.Trim()) } 
    if($csvitem) { 
     $fakefirst = $csvitem.fake_first_name 
     $fakelast = $csvitem.fake_last_name 
     $individual.'#Text' = "$fakelast, $fakefirst" 
    } 

    #Just be sure we don't get false positives because it remembered the last match 
    $csvitem = $null 
} 

$XMLcontents.Save($XMLnewPath) 
+0

정말 고마워요! – waylander232