具有XPath和多个名称空间的SelectSingleNode

时间:2016-02-10 16:51:47

标签: xml powershell xpath namespaces

我试图在PowerShell中选择一个存在多次的节点。我声明了名称空间并尝试使用XPath选择但没有成功。我只回来了。

我不确定我做错了什么,但我可以用

选择所有设置
typedef int INT

但我希望使用属性$selectedNode = $xml.SelectSingleNode("//ns:settings[@pass='oobeSystem']", $NSMGR) 来访问组件。 我尝试了不同的方法,但结果始终为NULL。

代码段:

@name="Microsoft-Windows-Shell-Setup"

XML片段:

$NSMGR = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
#$NSMGR.AddNamespace("ns", $xml.DocumentElement.NamespaceURI) default
$NSMGR.AddNamespace("ns", "urn:schemas-microsoft-com:unattend")
$NSMGR.AddNamespace("xsi", "http://www.w3.org/2001/xmlSchema-instance") 

#first try
$selectedNode = $xml.SelectSingleNode("//ns:settings[@pass='oobeSystem']/component[@name='Microsoft-Windows-International-Core']", $NSMGR)
$selectedNode = $xml.SelectSingleNode("//ns:settings[@pass='oobeSystem']/xsi:component[@name='Microsoft-Windows-International-Core']", $NSMGR)
$selectedNode

#second try
$selectedNode = $xml.SelectSingleNode("//ns:settings[@pass='oobeSystem']", $NSMGR)
$selectedNode = $selectedNode.SelectSingleNode("//ns:component[@name='Microsoft-Windows-Shell-Setup']", $NSMGR) #Edit to MS Shell instead of internal core for my example
$selectedNode

1 个答案:

答案 0 :(得分:0)

选择相对于特定父节点的所需子节点,如下所示:

$selectedNode = $xml.SelectSingleNode("//ns:settings[@pass='oobeSystem']/ns:component[@name='Microsoft-Windows-Shell-Setup']", $NSMGR)

或者像这样:

$parentNode = $xml.SelectSingleNode("//ns:settings[@pass='oobeSystem']", $NSMGR)
$selectedNode = $parentNode.SelectSingleNode("./ns:component[@name='Microsoft-Windows-Shell-Setup']", $NSMGR)

请注意,您需要为子节点的父使用ns:命名空间。