Как добавить элемент в пустой узел XML (CSCFG) в 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.

Пожалуйста, помогите мне.

2 ответа

Решение

Спасибо за это Кит, однако у меня была другая проблема, поскольку у файла cscfg есть пространство имен.

Приведенный ниже код сделал это без проблем. Но это когда xml привязан к пространству имен, особенно в файле CSCFG в Azure Deployments

$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)

Спасибо!!

Это потому что Certificates свойство возвращает строку:

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)
Другие вопросы по тегам