获取XmlNode所属XmlDocument调用ImportNode()时遇类型转换异常问题
PowerShell跨XmlDocument替换XmlNode的问题与解决
问题场景
我编写了一个PowerShell函数,需要接收来自不同XmlDocument的[xmlNode] $testElement和[xmlNode] $seedElement,在特定条件下将$testElement替换为$seedElement——这一步必须先把$seedElement导入到$testElement所属的XmlDocument中。
尝试过程与错误
最初我通过遍历父节点的方式获取目标根文档:
$workingElement = $testElement if ($workingElement.ParentNode.Name -ne '#Document') { do { $workingElement = $workingElement.ParentNode if ($workingElement.ParentNode.Name -eq '#Document') { $documentElement = $workingElement } } while (-not $documentElement) }
虽然输出显示已获取到类型为Xml的#document对象,但执行$replacementElement = $documentElement.ImportNode($seedElement, $true)时,抛出类型转换异常:无法将Collection`1[PSObject]转换为XmlNode。
之后改用更直接的方式获取所属文档:
$ownerDocument = $testElement.OwnerDocument $replacementElement = $ownerDocument.ImportNode($seedElement, $true) $testElement.ParentNode.ReplaceChild($replacementElement, $testElement)
依然报错。
根因与解决方法
最终定位到问题出在$seedElement的获取代码上:
$replaceElement = $validationXml.DocumentElement.ChildNodes.Where({$_.GetAttribute('type') -eq $testElement.GetAttribute('type')})
Where()方法返回的是单元素集合,尽管表面类型检查看似正常,但ImportNode()无法识别集合类型。改为直接取集合的第一个元素后,问题顺利解决:
$replaceElement = $validationXml.DocumentElement.ChildNodes.Where({$_.GetAttribute('type') -eq $testElement.GetAttribute('type')})[0]
内容的提问来源于stack exchange,提问作者Gordon
相关产品推荐
相关产品推荐

