2017-04-05 5 views
2

Ce code:Mise à jour élément de tableau dans le document xml

$test = @" 
<Test> 
    <Child>Hello</Child> 
    <Child>World</Child> 
</Test> 
"@ 

$xml = [xml]$test 
$xml.Test.Child[1] 

rendements:

World 

Ensuite ce code:

$xml.Test.Child[1] = "StackOVerflow" 
$xml.InnerXml 

rendements:

<Test><Child>Hello</Child><Child>World</Child></Test> 

Pourquoi le deuxième noeud Child n'est pas mis à jour de World à StackOverflow?

D'accord, nous allons essayer quelque chose de différent:

$ipaddress=([System.Net.DNS]::GetHostAddresses($hostname)|Where-Object {$_.AddressFamily -eq "InterNetwork"} | select-object IPAddressToString)[0].IPAddressToString 

Maintenant, je me demande ce que le type de $ipaddress est:

$ipaddress.GetType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 

Apparemment, c'est la chaîne.

$xml.Test.ChildNodes[1].'#text' = $ipaddress 
Cannot set "#text" because only strings can be used as values to set XmlNode properties. 
At line:1 char:1 
+ $xml.Test.ChildNodes[1].'#text' = $ipaddress 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], SetValueException 
    + FullyQualifiedErrorId : XmlNodeSetShouldBeAString 

Mais $ipaddress est la chaîne!

Cela fonctionne enfin:

$xml.Test.ChildNodes[1].'#text' = [string]$ipaddress 

Que se passe-t-il?

Répondre

1

Semble être lié à un bogue qui aurait pu être corrigé dans PowerShell 6. Je n'ai pas de machine Linux à portée de main pour vérifier. Vous trouverez une description de ce bug here.

Pendant ce temps, il y a une solution de contournement, comme vous l'avez trouvé:

$test = @" 
<Test> 
    <Child>Hello</Child> 
    <Child>World</Child> 
</Test> 
"@ 

$xml = [xml]$test 
$xml.Test 
$xml.Test.GetType()     # = XmlElement 

$xml.Test.Child[1]      # = World 
$xml.Test.Child[1].GetType()   # = String 

$xml.Test.Child[1] = "Tralala" 
$xml.Test.Child[1]      # = World 


$xml.Test.ChildNodes.Item(1).GetType() # = XmlElement 
$xml.Test.ChildNodes.Item(1)."#text" = "StackOverflow" 
$xml.Test.Child[1]      # = StackOverflow 
+0

Même comportement sur PowerShell 6.0.0-alpha.13 –

+0

vous pour cette Merci, mais comme vous avez sans doute remarqué, je l'ai posté le même travail autour de la question originale elle-même. –