spsman
Goto Top

Powershell String in XML-Node ersetzen

Hi,

In meinem Script Clone ich einzelne XML Nodes mit Unternodes und versuche darin Strings zu ersetzen. Allerdings gehen mir die Ideen aus wie das zu realisieren wäre.... Mit OuterXML bekomme ich zwar eine string. Den kriege ich aber nicht zurück in ein XML-Node Format...
XML:

<?xml version="1.0" encoding="utf-8"?>  
<Document>
  <Engineering version="V1.6" />  
  <DocumentInfo>
   </DocumentInfo>
  <SW.Blocks.FC ID="0">  
    <AttributeList>
    </AttributeList>
    <ObjectList ID="F">  
      <MultilingualText ID="1" CompositionName="Comment">  
      </MultilingualText>
      <SW.Blocks.CompileUnit ID="StrToReplaceTwo" CompositionName="CompileUnits">  
        <AttributeList Name="StrToReplace">  
		Kommentar
        </AttributeList>
        <ObjectList> StrToReplace</ObjectList>
      </SW.Blocks.CompileUnit>
      <SW.Blocks.CompileUnit ID="B" CompositionName="CompileUnits">  
         <ObjectList>
        
        </ObjectList>
      </SW.Blocks.CompileUnit>
      <MultilingualText ID="12" CompositionName="Title">  
        <ObjectList>
        </ObjectList>
      </MultilingualText>
    </ObjectList>
  </SW.Blocks.FC>
</Document>


Powershell:
$csv =@"  
'StrToReplace','StrToReplaceTwo'  
'NewString','NewString2'  
"@  

$csv>"F:\OPN\Test.csv"  
$CSVData=Import-Csv "F:\OPN\Test.csv"  


$CSVData| Format-Table


$CSVSpalten = $CSVData | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name'  

$Obj_reseve| Format-Table
# xml Objekt erstellen
$xml = New-Object XML
# xml laden
$xml.Load('F:\OPN\IN_Test.xml')  

$oldNode =$xml.SelectNodes("//ObjectList")  


foreach($Zeile in $CSVData){


foreach($Spalte in $CSVSpalten) 
{
$NewNode = $oldNode.clone()
#Attribut-Werte ersetzen ??? WILDCARD für Attributnamen
$NewNode.SelectNodes("//*[contains(@*,$Spalte)]")|ForEach-Object{foreach ($attr in $_.Attributes){$attr=$Zeile.$Spalte}}  
#InnerText ERsetzen
$NewNode -replace $Spalte,$Zeile.$Spalte

}
#$NewNode.ID=($NewNode.ID+'00').ToString()  

# hänge den kopierten Knoten im selben Parent wie vom Original wieder ins XML ein
$oldNode.ParentNode.InsertAfter($NewNode,$oldNode)

}
$xml.Save('F:\OPN\Out_Test.xml')  

Content-ID: 1331039454

Url: https://administrator.de/contentid/1331039454

Ausgedruckt am: 19.12.2024 um 10:12 Uhr

SPSman
Lösung SPSman 01.10.2021 um 21:03:46 Uhr
Goto Top
Lösung (Hochkomma muss gelöscht werden ;) )

$csv =@"  
'StrToReplace','StrToReplaceTwo'  
'NewString','NewString2'  
"@  

$csv>"F:\OPN\Test.csv"  
$CSVData=Import-Csv "F:\OPN\Test.csv"  


$CSVSpalten = $CSVData | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name'  

$Obj_reseve| Format-Table
# xml Objekt erstellen
$xml = New-Object XML
# xml laden
$xml.Load('F:\OPN\IN_Test.xml')  
#$xml| Format-List * -force
$oldNode =$xml.SelectSingleNode("//ObjectList")  
$NewNode = $oldNode.clone()

foreach($Zeile in $CSVData){

$NewNode = $oldNode.clone()

foreach($Spalte in $CSVSpalten) 
{
$NewNode.innerxml = $NewNode.innerxml -replace ($Spalte -replace "'"),($Zeile.$Spalte -replace "'")  
}
$oldNode.ParentNode.InsertAfter($NewNode,$oldNode)

}

$xml.Save('F:\OPN\Out_Test.xml')