Powershell System.Xml.XmlElement但我使用System.Xml.XmlDocument?

时间:2017-11-24 14:05:31

标签: xml powershell

我在PowerShell脚本中不断收到以下异常:

  

方法调用失败,因为[System.Xml.XmlElement]没有   包含名为CreateElement'。

的方法

但据我所知,我正在使用System.Xml.XmlDocumenthttps://msdn.microsoft.com/en-us/library/fw1ys7w6(v=vs.110).aspx

我做错了什么?

$file = "file.xml"
$xmlDoc = [System.Xml.XmlDocument](Get-Content $file)

if ($xmlDoc) {
    $xmlDoc.layout.nodes.SetAttribute("environment", "develop"); #this works

    $newNode = $xmlDoc.layout.nodes.CreateElement("Node")
    $newNode.SetAttribute("name", "Hello world")

    $xmlDoc.AppendChild($newNode)

    $xmlDoc.Save($systemConfigFile)
}

XML文件在我启动此脚本之前:

<layout>
    <nodes enviroment="[uknown]">
    </nodes>
</layout>

我希望结果如下:

<layout>
    <nodes enviroment="develop">
        <node name="Hello world" />
    </nodes>
</layout>

2 个答案:

答案 0 :(得分:8)

让我们来看看这一行:

$xmlDoc.layout.nodes.CreateElement("Node")

这是在对象CreateElement(...)上调用方法$xmlDoc.layout.nodes。我们可以把它分成两行:

$something = $xmlDoc.layout.nodes
$something.CreateElement("Node")

我们知道$xmlDocSystem.Xml.XmlDocument对象,但$something是什么类型的对象?它没有引用整个文档,它引用了<nodes>元素。从错误消息中,我们了解到它实际上是System.Xml.XmlElement对象。

向下几行,您会出现相反的错误:您在AppendChild上调用$xmldoc,实际上您想将追加到特定元素

所以,首先我们需要使用$xmlDoc创建新元素;然后我们可以使用$xmlDoc.layout.nodes(我之前称之为$something)来说明我们想要放置新元素的位置:

$newNode = $xmlDoc.CreateElement("Node")
$newNode.SetAttribute("name", "Hello world")

$xmlDoc.layout.nodes.AppendChild($newNode)

答案 1 :(得分:1)

要设置新节点,您必须使用CreateNode()在XML布局中声明一个新节点,并将此节点附加到父节点,如下所示:

$file = "file.xml"
[xml]$xmlDoc = [System.Xml.XmlDocument](Get-Content $file)

if ($xmlDoc) {
    $xmlDoc.layout.nodes.SetAttribute("environment", "develop")

    #part that adds new node
    $secNode = $xmlDoc.CreateNode("element","node",$null)
    $secNode.SetAttribute("Name","Hello world") | Out-Null
    $xmlDoc.layout.nodes.AppendChild($secNode) | Out-Null
}

$xmlDoc.Save($file)

退货:

<?xml version="1.0" encoding="UTF-8"?>
<layout>
  <nodes environment="develop">
    <node Name="Hello World" />
  </nodes>
</layout>