hello beatiful minds of stackoverflow.
i'm using powershell replace values (names) in xml fake names csv. i've got 2 files, real.xml (in element style) , fake.csv.
real.xml looks this:
<?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 looks this:
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
the end result powershell go through xml replacing real names in corresponding fake names csv. example given data above, cena, john replaced agar, sommer.
this i've got far.
#this script takes contents of xml , exchanges names in order appear names csv in order 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)
a loop + index won't here place random name on line. if have specific fake name per real name need search match each time:
#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 sure don't false positives because remembered last match $csvitem = $null } $xmlcontents.save($xmlnewpath)