在PowerShell中附加值

时间:2017-12-07 19:01:59

标签: xml powershell xml-parsing

目标:识别属性中具有特定值的元素,并使用用户输入附加已识别值的值。

我有一个XML文件,其中有多个资源元素,其中一些具有XML值,而另一些则没有。以下是一个例子。

<resources>
  <resource identifier="i149" href="items/i149/qti.xml">
    <file href="items/i149/qti.xml" />
  </resource>
</resources>

我被困在如何追加我已经确定的内容上。我目前正在使用SelectNodes()来确定包含i的任何标识符值都应附加$userInput。但是当我运行它时,我收到了这个错误:

  

无法转换参数&#34; 0&#34;,值为:&#34; _01a&#34;,for&#34; AppendChild&#34;键入&#34; System.Xml.XmlNode&#34;:&#34;无法转换&#34; _01a&#34; type&#34; System.String&#34;的值输入&#34; System.Xml.XmlNode&#34;。&#34;

我应该将XML作为字符串获取而不是SelectNodes()吗?以下是代码。

#user prompt
$userInput = Read-Host -Prompt 'Insert 2 alpha-numeric'

#ims
$imsnodes = [xml](Get-Content $ims.FullName)
$identifier = $imsnodes.SelectNodes("//*[contains(@identifier,'i')]")
$identifier.AppendChild("_$userInput")
$imsnodes.Save($_.FullName)

我希望得到的结果如下:XX = $userInput

<resources>
  <resource identifier="i149_XX" href="items/i149/qti_XX.xml">
    <file href="items/i149/qti_XX.xml" />
  </resource>
</resources>

1 个答案:

答案 0 :(得分:0)

您希望将字符串附加到属性值,而不是将XML节点附加到另一个XML节点(这是AppendChild()方法的作用)。

改变这个:

$identifier = $imsnodes.SelectNodes("//*[contains(@identifier,'i')]")
$identifier.AppendChild("_$userInput")

进入这个:

$imsnodes.SelectNodes("//*[contains(@identifier,'i')]") | ForEach-Object {
    $_.identifier += "_$userInput"
}

问题就会消失。