目标:识别属性中具有特定值的元素,并使用用户输入附加已识别值的值。
我有一个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>
答案 0 :(得分:0)
您希望将字符串附加到属性值,而不是将XML节点附加到另一个XML节点(这是AppendChild()
方法的作用)。
改变这个:
$identifier = $imsnodes.SelectNodes("//*[contains(@identifier,'i')]")
$identifier.AppendChild("_$userInput")
进入这个:
$imsnodes.SelectNodes("//*[contains(@identifier,'i')]") | ForEach-Object {
$_.identifier += "_$userInput"
}
问题就会消失。