使用PowerShell更改XML Element值

时间:2017-03-09 15:56:22

标签: xml powershell scripting

我只在StackOverflow上找到有关如何更改XML元素属性值的内容。

但是我们如何使用PowerShell更改元素本身的值?

我目前有:

XML

$filePathToTask = C:\Task.xml
$xml = New-Object XML
$xml.Load($filePathToTask)
$element =  $xml.SelectSingleNode("//Arguments")
$element.InnerText("newtext")
$xml.Save($filePathToTask)

SCRIPT

$ElementToChange =  $xml.SelectSingleNode("//Arguments")

但是,我似乎无法在最后一个变量上使用方法。我做错了什么?

修改

  • 添加了代码

我得到的错误是您无法在空值表达式上调用方法

我认为我的问题在于:

.SelectNodes

哪个保持为空,但我尝试了//Arguments之类的方法并使用socketio-jwt标记,但仍未成功

2 个答案:

答案 0 :(得分:8)

InnerText是属性,而不是方法。它是这样用的:

$element.InnerText = "newtext"

此外,我怀疑您的原始数据(与您发布的XML示例不同)使用命名空间。 AFAICS是$xml.SelectSingleNode('//Arguments')返回空结果的唯一可能原因。  从Windows任务计划程序导出的XML文件肯定是命名空间:

<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task‌​">
  <!-- ... -->
</Task>

命名空间与其他节点属性不同,不仅影响节点本身,还影响其子节点。要从具有命名空间的XML中选择节点,您需要namespace manager

$nsm = New-Object Xml.XmlNamespaceManager($xml.NameTable)
$nsm.AddNamespace('ns', $xml.DocumentElement.NamespaceURI)
$element = $xml.SelectSingleNode('//ns:Arguments', $nsm)

答案 1 :(得分:5)

当我跑步时:

$filePathToTask = "C:\temp\Task.xml"
$xml = New-Object XML
$xml.Load($filePathToTask)
$element =  $xml.SelectSingleNode("//Arguments")
$element.InnerText = "New Text"
$xml.Save($filePathToTask)

然后重新检查输出,我确实看到了更新的值:

<Task>
  <Settings>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>blablabla</Command>
      <Arguments>New Text</Arguments>
    </Exec>
  </Actions>
</Task>

我将路径括在引号中,否则我在加载线上出现错误。无论如何,这是一个很好的做法,因为Load方法的参数将 string filepath 作为输入。 然后正如Ansgar所提到的,使用赋值运算符(&#34; =&#34;)在内存中设置新值,然后转储到文件。