2017-05-20 2 views
1

Ich habe eine Reihe von XML-Dateien, die ich brauche, um einige Operationen innerhalb des Knotentextes zu ersetzen. Mein Code scheint den Knoten <Notes> nicht zu aktualisieren, da er nicht gefunden werden kann. Ich habe den XML-Pfad in Notepad ++ überprüft und es sieht korrekt aus.Ersetzen funktioniert nicht auf XML-Knoten

Dies ist eine XML-Beispieldatei, mit der ich testen möchte.

<?xml version="1.0" encoding="UTF-8"?> 
<OrganisationUnits> 
    <OrganisationUnitsRow num="21"> 
    <OrganisationId>ORG1</OrganisationId> 
    <OrganisationName>ORG 1 TEST</OrganisationName> 
    <Addresses> 
     <AddressesRow num="1"> 
     <AddressId>E41002</AddressId> 
     <MainAddress>Y</MainAddress> 
     </AddressesRow> 
    </Addresses> 
    <ContactDetails> 
     <ContactDetailsRow num="1"> 
     <ContactId>E6366</ContactId> 
     <ContactCode>OFFICE</ContactCode> 
     <Main>N</Main> 
     <Notes>start date 11/03/1994</Notes> 
     </ContactDetailsRow> 
     <ContactDetailsRow num="2"> 
     <ContactId>E6367</ContactId> 
     <ContactCode>WORK</ContactCode> 
     <Main>N</Main> 
     <Notes>start date 11/03/1995</Notes> 
     </ContactDetailsRow> 
     <ContactDetailsRow num="3"> 
     <ContactId>E6368</ContactId> 
     <ContactCode>HOME</ContactCode> 
     <Main>Y</Main> 
     <Notes>start date - after 11/03/1995</Notes> 
     </ContactDetailsRow> 
     <ContactDetailsRow num="4"> 
     <ContactId>E6369</ContactId> 
     <ContactCode>EMAIL</ContactCode> 
     <ContactCodeDesc>Email Address</ContactCodeDesc> 
     <ContactValue>[email protected]</ContactValue> 
     <StartDate>2000-03-11</StartDate> 
     <Main>N</Main> 
     <Notes>more test notes</Notes> 
     </ContactDetailsRow> 
    </ContactDetails> 
    <Sector>P</Sector> 
    <SectorDesc>Private</SectorDesc> 
    </OrganisationUnitsRow> 
</OrganisationUnits> 

und das ist mein Skript.

#----- get source xml file(e) from the folder below ---# 
$path = "C:\Dump\TEST" 
$Files = Get-Childitem -path $path -File -include test_file_1.xml -name 

# For every file in the folder specified perform a series of actions below 
foreach ($File in $Files) 
{ 
    Write-Host "=== FILE is $File ===" -ForegroundColor "White" 
    $xml = [xml](Get-Content $path\$File) 

    ## SectorDesc 
    # check to ensure that we have got a SectorDesc row 
    foreach ($OrganisationUnitsRow in $xml.OrganisationUnits.OrganisationUnitsRow) 
    { 
     if ($OrganisationUnitsRow.Item('SectorDesc')) 
     { 
      $xml.OrganisationUnits.OrganisationUnitsRow.SectorDesc = $xml.OrganisationUnits.OrganisationUnitsRow.SectorDesc.Replace("`b" , "\b")    #backspace 
      $xml.OrganisationUnits.OrganisationUnitsRow.SectorDesc = $xml.OrganisationUnits.OrganisationUnitsRow.SectorDesc.Replace("`f" , "\f")    #form feed 
     } 
    } 

    ## Notes 
    # check to ensure that we have got a Notes row 
    foreach ($ContactDetailsRow in $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow) 
    { 
     if ($ContactDetailsRow.Item('Notes')) 
     { 
      Write-Host "$ContactDetailsRow.Notes" 
      $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow.Notes = $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow.Notes.Replace("\" , "\\")    #back slash 
      $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow.Notes = $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow.Notes.Replace("`b" , "\b")    #backspace 
     } 

    } 

    $xml.Save("$path\$File") 
} 

Wenn das Skript ausgeführt wird, wird ein Fehler ausgegeben.

 
Property 'Notes' cannot be found on this object; make sure it exists and is 
settable. 
At C:\Dump\test10.ps1:33 char:8 
+     $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetails ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : PropertyAssignmentException 

Property 'Notes' cannot be found on this object; make sure it exists and is 
settable. 
At C:\Dump\test10.ps1:34 char:8 
+     $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetails ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : PropertyAssignmentException 

Ich bin vielleicht ziemlich offensichtlich, aber ich kann es nicht sofort sehen.

Antwort

3

Der Ausdruck $xml.Organis...ailsRow.Notes gibt Ihnen den <Notes> Kind-Knoten von alle<ContactDetailsRow> Knoten (im Beispiel 4). Verwenden Sie Ihre Schleife Variable statt (und Sie können verketten die Replace() Anrufe):

foreach ($ContactDetailsRow in $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow) 
{ 
    if ($ContactDetailsRow.Item('Notes')) 
    {   
     Write-Host "$ContactDetailsRow.Notes" 
     $ContactDetailsRow.Notes = $ContactDetailsRow.Notes.Replace("\", "\\").Replace("`b", "\b") 
    } 
} 

Noch besser wäre es, direkt wählen Sie die <Notes> Kind-Knoten mit einem XPath-Ausdruck:

$xml.SelectNodes('//ContactDetailsRow/Notes') | ForEach-Object { 
    $_.'#text' = $_.'#text'.Replace("\", "\\").Replace("`b", "\b") 
} 

Der Grund, warum Ihr Code wirft nicht den gleichen Fehler für Ihre erste verschachtelte Schleife (wo Sie den gleichen Fehler gemacht haben) ist, dass Ihre XML-Beispiel enthält nur einen einzigen <SectorDesc>-Knoten, so löst es nicht das Problem dort.

+0

Dank @Ansgar Wiechers zu erklären, warum mein Code falsch war - gut, den Grund zu haben, warum es falsch war – zoomzoomvince

Verwandte Themen