如何将元素添加到 PowerShell 中的空 XML (CSCFG) 节点
How do you add an element to an empty XML (CSCFG) node in PowerShell
我有一个 xml 文件(CSCFG 文件),如下所示
XML 文件:
<Role name="Role1">
<Instances count="2" />
<ConfigurationSettings>
<Setting name="Key1" value="123456" />
<Setting name="Key2" value="1234567890" />
<Setting name="Key3" value="true" />
</ConfigurationSettings>
<Certificates>
</Certificates>
</Role>
我需要在证书节点中添加多个证书元素。
成为XML:
<Role name="Role1">
<Instances count="2" />
<ConfigurationSettings>
<Setting name="Key1" value="123456" />
<Setting name="Key2" value="1234567890" />
<Setting name="Key3" value="true" />
</ConfigurationSettings>
<Certificates>
<Certificate name="certificate1" thumbprint="12345678" />
<Certificate name="certificate2" thumbprint="01234567" />
<Certificate name="certificate3" thumbprint="09876543" />
</Certificates>
</Role>
我正在尝试使用下面的代码
$xmlDoc = [System.Xml.XmlDocument](Get-Content $configFile);
$xmlDoc.Role.Certificates.AppendChild($xmlDoc.CreateElement("Certificate"));
$newXmlCertificate.SetAttribute(“name”,$certName);
$newXmlCertificate.SetAttribute(“thumbprint”,$CertThumbprint);
$xmlDoc.save($configFile)
这是执行此操作时遇到的异常:
方法调用失败,因为 [System.String] 不包含名为 'AppendChild'.
的方法
请帮帮我。
那是因为Certificates
属性returns一个字符串:
25> $xmlDoc.Role.Certificates.GetType().FullName
System.String
因为元素是没有属性的叶元素,PowerShell 将元素的表示简化为包含元素内容的字符串 属性。你可以通过这样的方式得到你想要的:
26> [xml]$xmlDoc = @'
>>> <Role name="Role1">
>>> <Instances count="2" />
>>> <ConfigurationSettings>
>>> <Setting name="Key1" value="123456" />
>>> <Setting name="Key2" value="1234567890" />
>>> <Setting name="Key3" value="true" />
>>> </ConfigurationSettings>
>>> <Certificates>
>>> </Certificates>
>>> </Role>
>>> '@
27> $certElem = $xmlDoc.CreateElement('Certificate')
28> $certElem.SetAttribute('name','certificate1')
29> $certElem.SetAttribute('thumbprint','12345678')
30> $xmlDoc.SelectSingleNode('/Role/Certificates').AppendChild($certElem)
31. $xmlDoc.Save($configFile)
感谢 Keith,但是我遇到了一些其他问题,因为 cscfg 文件有一个命名空间。
下面的代码使它没有任何问题地工作。 但这是 xml 绑定到命名空间的时候,特别是在 Azure 部署中的 CSCFG 文件中
$xmlDoc = [System.Xml.XmlDocument](Get-Content $configFile);
$ns = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
$ns.AddNamespace("ns", $xmlDoc.DocumentElement.NamespaceURI)
$node = $xmlDoc.SelectSingleNode("//ns:Certificates", $ns)
$newNode = $xmlDoc.CreateElement("Certificate");
$newNode.SetAttribute('name',"certificate1")
$newNode.SetAttribute('value',"12345678")
$node.AppendChild($newNode)
$xmlDoc.save($configFile)
谢谢!!
我有一个 xml 文件(CSCFG 文件),如下所示
XML 文件:
<Role name="Role1">
<Instances count="2" />
<ConfigurationSettings>
<Setting name="Key1" value="123456" />
<Setting name="Key2" value="1234567890" />
<Setting name="Key3" value="true" />
</ConfigurationSettings>
<Certificates>
</Certificates>
</Role>
我需要在证书节点中添加多个证书元素。
成为XML:
<Role name="Role1">
<Instances count="2" />
<ConfigurationSettings>
<Setting name="Key1" value="123456" />
<Setting name="Key2" value="1234567890" />
<Setting name="Key3" value="true" />
</ConfigurationSettings>
<Certificates>
<Certificate name="certificate1" thumbprint="12345678" />
<Certificate name="certificate2" thumbprint="01234567" />
<Certificate name="certificate3" thumbprint="09876543" />
</Certificates>
</Role>
我正在尝试使用下面的代码
$xmlDoc = [System.Xml.XmlDocument](Get-Content $configFile);
$xmlDoc.Role.Certificates.AppendChild($xmlDoc.CreateElement("Certificate"));
$newXmlCertificate.SetAttribute(“name”,$certName);
$newXmlCertificate.SetAttribute(“thumbprint”,$CertThumbprint);
$xmlDoc.save($configFile)
这是执行此操作时遇到的异常: 方法调用失败,因为 [System.String] 不包含名为 'AppendChild'.
的方法请帮帮我。
那是因为Certificates
属性returns一个字符串:
25> $xmlDoc.Role.Certificates.GetType().FullName
System.String
因为元素是没有属性的叶元素,PowerShell 将元素的表示简化为包含元素内容的字符串 属性。你可以通过这样的方式得到你想要的:
26> [xml]$xmlDoc = @'
>>> <Role name="Role1">
>>> <Instances count="2" />
>>> <ConfigurationSettings>
>>> <Setting name="Key1" value="123456" />
>>> <Setting name="Key2" value="1234567890" />
>>> <Setting name="Key3" value="true" />
>>> </ConfigurationSettings>
>>> <Certificates>
>>> </Certificates>
>>> </Role>
>>> '@
27> $certElem = $xmlDoc.CreateElement('Certificate')
28> $certElem.SetAttribute('name','certificate1')
29> $certElem.SetAttribute('thumbprint','12345678')
30> $xmlDoc.SelectSingleNode('/Role/Certificates').AppendChild($certElem)
31. $xmlDoc.Save($configFile)
感谢 Keith,但是我遇到了一些其他问题,因为 cscfg 文件有一个命名空间。
下面的代码使它没有任何问题地工作。 但这是 xml 绑定到命名空间的时候,特别是在 Azure 部署中的 CSCFG 文件中
$xmlDoc = [System.Xml.XmlDocument](Get-Content $configFile);
$ns = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
$ns.AddNamespace("ns", $xmlDoc.DocumentElement.NamespaceURI)
$node = $xmlDoc.SelectSingleNode("//ns:Certificates", $ns)
$newNode = $xmlDoc.CreateElement("Certificate");
$newNode.SetAttribute('name',"certificate1")
$newNode.SetAttribute('value',"12345678")
$node.AppendChild($newNode)
$xmlDoc.save($configFile)
谢谢!!