PowerShell 不允许我将 XML 节点添加到 XML 文件使用 PowerShell 5.1.183

问题描述

一周以来,我一直在尝试将 XML 节点附加到父 XML 元素。子节点和父节点如下所示:

[xml]$childxml = @"
<ClaimsProvider>
    <Bomain> hey there</Bomain>
    <Name>Login using </Name>
    <TechnicalProfiles>
        <TechnicalProfile Id="MIDC-What">
            <displayName> Employee</displayName>
            <Description>Login with your account</Description>
            <Protocol Name="OpenIdConnect" />
            <Metadata>
                <Item Key="MetaDATA">https://login.microsoftonline.com</Item>
                <Item Key="client_id">Mangal</Item>
                <Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com</Item>
            </Metadata>
            <Cryptograph>
                <Key Id="client_secret" StorageReferenceId="key" />
            </Cryptograph>
            <IncludeTechnicalProfile ReferenceId="MIDC-Shared" />
        </TechnicalProfile>
    </TechnicalProfiles>
</ClaimsProvider>
"@

我想把这个子节点添加到这个文件中(文件名:permissions.xml

<TrustFrameworkPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"">
  <BasePolicy>
  </BasePolicy>
  <BuildingBlocks></BuildingBlocks>
  <ClaimsProviders>
    <ClaimsProvider>
    <Bomain> hey there 1</Bomain>
    <Name>Login using </Name>
    <TechnicalProfiles>
        <TechnicalProfile Id="MIDC-What">
            <displayName> Employee</displayName>
            <Description>Login with your account</Description>
            <Protocol Name="OpenIdConnect" />
            <Metadata>
                <Item Key="MetaDATA">https://login.microsoftonline.com</Item>
                <Item Key="client_id">Mangal</Item>
                <Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com</Item>
            </Metadata>
            <Cryptograph>
                <Key Id="client_secret" StorageReferenceId="key" />
            </Cryptograph>
            <IncludeTechnicalProfile ReferenceId="MIDC-Shared" />
        </TechnicalProfile>
    </TechnicalProfiles>
</ClaimsProvider>
    <ClaimsProvider>
    <Bomain> hey there 2</Bomain>
    <Name>Login using </Name>
    <TechnicalProfiles>
        <TechnicalProfile Id="MIDC-What">
            <displayName> Employee</displayName>
            <Description>Login with your account</Description>
            <Protocol Name="OpenIdConnect" />
            <Metadata>
                <Item Key="MetaDATA">https://login.microsoftonline.com</Item>
                <Item Key="client_id">Mangal</Item>
                <Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com</Item>
            </Metadata>
            <Cryptograph>
                <Key Id="client_secret" StorageReferenceId="key" />
            </Cryptograph>
            <IncludeTechnicalProfile ReferenceId="MIDC-Shared" />
        </TechnicalProfile>
    </TechnicalProfiles>
</ClaimsProvider>
    <ClaimsProvider>
    <Bomain> hey there 3</Bomain>
    <Name>Login using </Name>
    <TechnicalProfiles>
        <TechnicalProfile Id="MIDC-What">
            <displayName> Employee</displayName>
            <Description>Login with your account</Description>
            <Protocol Name="OpenIdConnect" />
            <Metadata>
                <Item Key="MetaDATA">https://login.microsoftonline.com</Item>
                <Item Key="client_id">Mangal</Item>
                <Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com</Item>
            </Metadata>
            <Cryptograph>
                <Key Id="client_secret" StorageReferenceId="key" />
            </Cryptograph>
            <IncludeTechnicalProfile ReferenceId="MIDC-Shared" />
        </TechnicalProfile>
    </TechnicalProfiles>
</ClaimsProvider>
  </ClaimsProviders>
</TrustFrameworkPolicy>

我现在正在这样做:

  1. 将文档保存在变量中
$doc = [xml](Get-Content permissions.xml)
  1. 将子变量附加到 $doc xml
[Void]$doc.TrustFrameworkPolicy.ClaimsProviders.AppendChild($childxml)

我收到以下错误

使用“1”参数调用“AppendChild”的异常:“指定的节点不能作为该节点的有效子节点插入,因为指定的节点类型错误。”

解决方法

您不能附加来自不同 XML 文档的 XmlNode。相反,您必须从要附加到的文档创建一个节点:

$childxml = $doc.CreateDocumentFragment()
$childxml.InnerXml = @'
<ClaimsProvider>
    <Bomain> hey there</Bomain>
    <Name>Login using </Name>
    <TechnicalProfiles>
        <TechnicalProfile Id="MIDC-What">
            <DisplayName> Employee</DisplayName>
            <Description>Login with your account</Description>
            <Protocol Name="OpenIdConnect" />
            <Metadata>
                <Item Key="METADATA">https://login.microsoftonline.com</Item>
                <Item Key="client_id">Mangal</Item>
                <Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com</Item>
            </Metadata>
            <Cryptograph>
                <Key Id="client_secret" StorageReferenceId="key" />
            </Cryptograph>
            <IncludeTechnicalProfile ReferenceId="MIDC-Shared" />
        </TechnicalProfile>
    </TechnicalProfiles>
</ClaimsProvider>
'@

[Void]$doc.TrustFrameworkPolicy.ClaimsProviders.AppendChild($childxml)

另见:Append XML string block to existing XmlDocument