Powershell 更新xml文档中的数组元素
此代码:Powershell 更新xml文档中的数组元素,powershell,powershell-5.0,Powershell,Powershell 5.0,此代码: $test = @" <Test> <Child>Hello</Child> <Child>World</Child> </Test> "@ $xml = [xml]$test $xml.Test.Child[1] 然后这个代码: $xml.Test.Child[1] = "StackOVerflow" $xml.InnerXml 收益率: World <Test><Child&g
$test = @"
<Test>
<Child>Hello</Child>
<Child>World</Child>
</Test>
"@
$xml = [xml]$test
$xml.Test.Child[1]
然后这个代码:
$xml.Test.Child[1] = "StackOVerflow"
$xml.InnerXml
收益率:
World
<Test><Child>Hello</Child><Child>World</Child></Test>
现在我想知道$ipaddress
的类型是什么:
$ipaddress.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
很明显,是绳子
$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
但是$ipaddress
是字符串
这最终会起作用:
$xml.Test.ChildNodes[1].'#text' = [string]$ipaddress
发生了什么?似乎与PowerShell 6中可能已修复的错误有关。我手头没有Linux机器可以检查 您将找到该错误的描述 同时,正如您所发现的,还有一个变通方法:
$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
$test=@”
你好
世界
"@
$xml=[xml]$test
$xml.Test
$xml.Test.GetType()#=XmlElement
$xml.Test.Child[1]#=世界
$xml.Test.Child[1].GetType()#=String
$xml.Test.Child[1]=“Tralala”
$xml.Test.Child[1]#=世界
$xml.Test.ChildNodes.Item(1.GetType()#=XmlElement
$xml.Test.ChildNodes.Item(1)。“#text”=“StackOverflow”
$xml.Test.Child[1]#=堆栈溢出
PowerShell 6.0.0-alpha.13上的相同行为谢谢您,但您可能已经注意到,我在原始问题中发布了相同的解决方法。
$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