使用PowerShell,如何添加多个名称空间(其中一个是默认名称空间)?

使用PowerShell,如何添加多个名称空间(其中一个是默认名称空间)?,powershell,namespaces,Powershell,Namespaces,我有一个XML文档,它包含两个名称空间(“默认”名称空间和xlink): xmlns=”http://embassy/schemas/dudezilla/" xmlns:xlink=”http://www.w3.org/1999/xlink" 如何在PowerShell代码中指定“两个”名称空间?PowerShell似乎希望为默认名称空间添加前缀。我该怎么做 现在我有以下代码(不确定默认名称空间要包含什么): 谢谢 找到了答案。必须使用$null作为默认命名空间的前缀($null相当于C#中

我有一个XML文档,它包含两个名称空间(“默认”名称空间和xlink):

  • xmlns=”http://embassy/schemas/dudezilla/"
  • xmlns:xlink=”http://www.w3.org/1999/xlink"
如何在PowerShell代码中指定“两个”名称空间?PowerShell似乎希望为默认名称空间添加前缀。我该怎么做

现在我有以下代码(不确定默认名称空间要包含什么):


谢谢

找到了答案。必须使用$null作为默认命名空间的前缀($null相当于C#中的String.Empty)

工作代码:

    [System.Xml.XmlNamespaceManager] $nsmgr = $xml.NameTable;
    $nsmgr.AddNamespace($null,'http://embassy/schemas/dudezilla/');
    $nsmgr.AddNamespace('xlink','http://www.w3.org/1999/xlink');

    [System.Xml.XmlNodeList] $nodelist;
    [System.Xml.XmlElement] $root = $xml.DocumentElement;
    $nodelist = $root.SelectNodes("//image/@xlink:href", $nsmgr);

    Foreach ($xmlnode in $nodelist)
    {
        $xmlnode.Value;
    }

PowerShell v2简化了这一过程:

$ns = @{
         dns="http://embassy/schemas/dudezilla/"
         xlink="http://www.w3.org/1999/xlink"
       }

$xml | Select-Xml '//dns:image/@xlink:href' -Namespace $ns
如果您想以另一种方式进行,请尝试:

$nsmgr = New-Object System.Xml.XmlNamespaceManager $xml.NameTable
$nsmgr.AddNamespace('dns','http://embassy/schemas/dudezilla/')
$nsmgr.AddNamespace('xlink','http://www.w3.org/1999/xlink')

$root = $xml.DocumentElement
$nodelist = $root.SelectNodes("//dns:image/@xlink:href", $nsmgr)

foreach ($xmlnode in $nodelist)
{
    $xmlnode.Value
}

在上面的第一个示例中,我在最后一行中添加了以下内容以获取值:
|foreach object{$\uu.node.InnerXML}
有人能解释一下为什么在PowerShell中的
$xml.NameTable
对象上没有
NameTable
成员时,
[System.xml.XmlDocument]
仍然有效吗?
$nsmgr = New-Object System.Xml.XmlNamespaceManager $xml.NameTable
$nsmgr.AddNamespace('dns','http://embassy/schemas/dudezilla/')
$nsmgr.AddNamespace('xlink','http://www.w3.org/1999/xlink')

$root = $xml.DocumentElement
$nodelist = $root.SelectNodes("//dns:image/@xlink:href", $nsmgr)

foreach ($xmlnode in $nodelist)
{
    $xmlnode.Value
}