SelectSingleNode返回空值

时间:2019-04-12 12:16:47

标签: powershell

我正在尝试从XML文档中选择和删除单个节点。下面的示例代码和XML:

[xml]$xml = Get-Content MyXml.xml    
$xml.MigrationTable.Mapping[1].SelectSingleNode("DestinationSameAsSource")

这当前不返回任何内容。此answer显示了一个C#示例,该示例在调用SelectSingleNode()方法时包括名称空间。

如何在PowerShell中将SelectSingleNode()包含在名称空间中?

XML:

<?xml version="1.0" encoding="UTF-16"?>
<MigrationTable xmlns="http://microsoft.com/GroupPolicy/GPOOperations/MigrationTable" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Mapping>
<Type>LocalGroup</Type>
<Source>Group1@Contoso.local</Source>
<Destination>Group2@contoso.local</Destination>
</Mapping>
<Mapping>
<Type>Unknown</Type>
<Source>Network Service</Source>
<DestinationSameAsSource/>
</Mapping>
<Mapping>
<Type>Unknown</Type>
<Source>Local Service</Source>
<DestinationSameAsSource/>
</Mapping>
</MigrationTable>

1 个答案:

答案 0 :(得分:1)

用于NameTable处理的Powershell语法与C#非常相似。加载数据后,基于XML文档创建一个NamespaceManager。

要选择元素,需要使用dummy namespace prefix,在此示例x中已在Xpath中添加并使用了该元素。像这样

[xml]$xml = Get-Content MyXml.xml
$nsmgr = new-object Xml.XmlNamespaceManager($xml.NameTable)
$nsmgr.AddNameSpace("x", "http://microsoft.com/GroupPolicy/GPOOperations/MigrationTable")
$xml.MigrationTable.Mapping[1].SelectSingleNode("x:DestinationSameAsSource", $nsmgr)