2015-04-05 51 views
0

的元素添加到一個空的XML(CSCFG)節點我有一個XML文件(CSCFG文件)像下面如何在PowerShell中

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="" /> 
     <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'的方法。

請幫我一把。

+0

爲什麼這個問題投下來??如果讀者不知道答案,它會被拒絕嗎? – 2015-04-05 21:45:33

+0

我不確定爲什麼這會被拒絕,除非你的標題不是問題。嘗試將其重新引入問題的形式:「如何將元素添加到PowerShell中的空白XML節點?」除此之外,通過向您簡單介紹您嘗試的內容,避免了最大的問題。 – 2015-04-05 22:20:05

回答

1

感謝基思,但我有一些其他的問題,因爲cscfg文件有一個命名空間。

下面的代碼使其工作沒有任何問題。 但是,這是當XML被捆綁到一個命名空間,特別是在一個CSCFG文件在Azure的部署

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

謝謝!

2

這是因爲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)