在 PowerShell 中删除 XML 节点会删除我需要的额外标记
Removing XML Node In PowerShell Removes Extra Tags That I Need
我有一个 XML 文件,格式如下:
<?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>
我的目标是删除此部分:
<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>
我运行宁的PowerShell脚本如下:
$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)
不幸的是,当我 运行 它时,它还会从任何没有参数子节点的添加节点中删除任何结束标记。因此,它现在看起来像这样:
<?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>
关于如何在不删除额外的结束标记的情况下将其添加到 运行 的任何建议?
这似乎是 XmlElement.WriteTo()
和类似方法的默认行为 - 对没有内部非 xml 内容的任何叶元素使用简短标记。
这是由每个元素的 inspecting the IsEmpty
property 决定的,因此您可以通过在调用 [=15= 之前将 IsEmpty
设置为 $false
来欺骗作者保留长格式标签]:
# 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)
我有一个 XML 文件,格式如下:
<?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>
我的目标是删除此部分:
<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>
我运行宁的PowerShell脚本如下:
$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)
不幸的是,当我 运行 它时,它还会从任何没有参数子节点的添加节点中删除任何结束标记。因此,它现在看起来像这样:
<?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>
关于如何在不删除额外的结束标记的情况下将其添加到 运行 的任何建议?
这似乎是 XmlElement.WriteTo()
和类似方法的默认行为 - 对没有内部非 xml 内容的任何叶元素使用简短标记。
这是由每个元素的 inspecting the IsEmpty
property 决定的,因此您可以通过在调用 [=15= 之前将 IsEmpty
设置为 $false
来欺骗作者保留长格式标签]:
# 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)