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-Key: 1331039454

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

Printed on: April 24, 2024 at 04:04 o'clock

Member: SPSman
Solution SPSman Oct 01, 2021 at 19:03:46 (UTC)
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')