2017-05-10 2 views
1

ich eine XML-Datei in folgendem Format haben:Entfernen XML Knoten In Powershell Entfernt Extra-Tags, die ich benötige

<?xml version="1.0" encoding="utf-8"?> 
<factory> 
    <map> 
    <add key="Audit" assembly="Python.Platform.Core.dll" class="Python.Core.Audit.Services.Audit"> 
     <parameter name="configFilePath" class="string" value="Config\Audit\AuditConfiguration.xml" /> 
    </add> 
    <add key="Security.Password" assembly="OpenContent.Platform.Core.dll" class="OpenContent.Core.Security.Services.PasswordSecurityMD5"> 
    </add> 
    <add key="Security.Password.Local" assembly="OpenContent.Platform.Core.dll" class="OpenContent.Core.Security.Services.PasswordSecurityMD5"> 
    </add> 
    <add key="Guest.Registration" assembly="OpenContent.Platform.Core.dll" class="OpenContent.Core.Guest.Services.DbGuestRegistration"> 
     <parameter name="registrationStoredProcedure" class="string" value="AddNewGuest" /> 
     <parameter name="updateEncodedKeyStoredProcedure" class="string" value="UpdateGuestEncodedKey" /> 
     <parameter name="unregistrationStoredProcedure" class="string" value="DeleteGuest" /> 
     <parameter name="DeleteExpiredGuestStoredProcedure" class="string" value="DeleteExpiredGuest" /> 
     <parameter name="defaultValidDays" class="int" value="30" /> 
    </add> 
    </map> 
</factory> 

Mein Ziel ist es, diesen Abschnitt zu entfernen:

<add key="Audit" assembly="Python.Platform.Core.dll" class="Python.Core.Audit.Services.Audit"> 
     <parameter name="configFilePath" class="string" value="Config\Audit\AuditConfiguration.xml" /> 
    </add> 

Die Powershell-Skript I ‚m ausgeführt ist wie folgt:

$path = "C:\testing\myxml.xml" 

[Xml]$myxml = Get-Content -Path $path -Raw 

$old = $myxml.SelectSingleNode("/factory/map/add[@key='Audit']") 

$parent = $old.ParentNode 
[void] $parent.RemoveChild($old) 

$myxml.save($path) 

Unfortu Wenn ich es ausführe, entfernt es auch jedes schließende Tag von jedem Add-Knoten, der keinen untergeordneten Parameter-Knoten hat. Anstatt also nur den Abschnitt zu löschen ich löschen möchten (was es tut), es sieht nun wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 
<factory> 
    <map> 



    <add key="Security.Password" assembly="OpenContent.Platform.Core.dll" class="OpenContent.Core.Security.Services.PasswordSecurityMD5"> 

    <add key="Security.Password.Local" assembly="OpenContent.Platform.Core.dll" class="OpenContent.Core.Security.Services.PasswordSecurityMD5"> 

    <add key="Guest.Registration" assembly="OpenContent.Platform.Core.dll" class="OpenContent.Core.Guest.Services.DbGuestRegistration"> 
     <parameter name="registrationStoredProcedure" class="string" value="AddNewGuest" /> 
     <parameter name="updateEncodedKeyStoredProcedure" class="string" value="UpdateGuestEncodedKey" /> 
     <parameter name="unregistrationStoredProcedure" class="string" value="DeleteGuest" /> 
     <parameter name="DeleteExpiredGuestStoredProcedure" class="string" value="DeleteExpiredGuest" /> 
     <parameter name="defaultValidDays" class="int" value="30" /> 
    </add> 
    </map> 
</factory> 

Vorschläge, wie dies zu umgehen, ohne entfernen die zusätzlichen schließenden Tags zu laufen?

Antwort

1

Dies scheint das Standardverhalten von XmlElement.WriteTo() und ähnliche Methoden zu sein - Verwenden von Kurzform-Tags für alle Blattelemente, die keinen inneren Nicht-XML-Inhalt haben.

Die Art und Weise dies bestimmt wird durch inspecting the IsEmpty property jedes Element, so dass Sie IsEmpty-$false indem vor Save() Aufruf einen Schriftsteller in der Erhaltung Longform-Tags Trick können:

# Locate all <add /> nodes with no child elements 
$addLeafNodes = $myxml.SelectNodes('//add[not(child::*)]') 

# Loop through them 
foreach($node in $AddLeafNodes){ 
    # Set IsEmpty property to false 
    $node.IsEmpty = $false 
} 

# Save document 
$myxml.Save($path) 
+0

Hm ..., die nicht schien alles ändern. –

+0

Bei weiteren Untersuchungen glaube ich nicht, dass es jemals ein Problem gab ... Ich hatte damit begonnen, eine Sicherungskopie der Datei myxml.xml.original zu erstellen. Nachdem ich die Änderungen vorgenommen habe, habe ich myxml.xml.original mit myxml.xml verglichen ... Anscheinend ist es CompareIt, das diese Zeile nicht mochte ... Wenn ich in die Datei schaue, sind die Tags definitiv da, aber CompareIt tut es anscheinend nicht wie XML-Dateien. –

+0

@ChristopherCass Könnte wegen der Unterschiede in Leerzeichen dann sein –

Verwandte Themen