我在向xml数组属性添加值时遇到问题。 xml看起来像这样:
$xml = [xml]@"
<letters>
<letter><to>mail a</to></letter>
<letter>
<to>mail a</to>
<to>mail b</to>
</letter>
</letters>
"@
$letter = $xml.letters.letter[1]
$letter.to
#mail a
#mail b
现在我想将项目(“mail c”,“mail d”)添加到“to”数组中:
$letter.to
#mail a
#mail b
#mail c
#mail d
但我似乎无法做到。
a)只是尝试向属性设置任何内容会导致误导性错误:
$letter.to += "a"
#"to" kann nicht festgelegt werden, da nur Zeichenfolgen als Werte zum Festlegen von XmlNode-Eigenschaften verwendet werden können.
#Bei Zeile:1 Zeichen:9
#+ $letter. <<<< to += "a"
# + CategoryInfo : InvalidOperation: (:) [], RuntimeException
# + FullyQualifiedErrorId : PropertyAssignmentException
但这可能归结为“没有”设定者:
$letter | Get-Member
#Name MemberType Definition
#[bunch of stuff]
#to Property System.Object[] {get;}
b)通过SetAttribute设置值部分有效,但会导致无法使用(且非常奇怪)的行为:
$letter.SetAttribute("to", "mail c")
$letter.to
#mail c <- why is it up front?
#mail a
#mail b
$letter.SetAttribute("to", "mail d")
$letter.to
#mail d <- why is mail c gone?
#mail a
#mail b
有没有人知道下一步该尝试什么?
答案 0 :(得分:2)
基本上,您要创建新的XmlElement
,设置InnerText
值,并将其附加到父<letter>
元素:
$to = $xml.CreateElement("to")
$to.InnerText = "mail c"
$letter.AppendChild($to)
$letter.to
输出:
mail a
mail b
mail c
类似的示例可以在XmlNode.AppendChild()
的MSDN文档中找到。
答案 1 :(得分:1)
这样就可以了,你可以创建一个片段并为to标签添加innerxml(因为它是非结构化的):
$letter = $xml.letters.letter[1]
$to= $xml.CreateDocumentFragment();
# Create the to node
$to.InnerXml = "<to>mail c</to>"
$letter.AppendChild($to);
# show the node
$letter
您可以使用以下内容在文档上创建to标记:
$to = $xml.CreateElement("to")
然后设置它的属性(内部文本):
$to.InnerText = "mail c"
并附上
项目$letter.AppendChild($to)