Powershell将项添加到xml数组属性

时间:2016-02-23 10:48:37

标签: .net xml powershell

我在向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 

有没有人知道下一步该尝试什么?

2 个答案:

答案 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)