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

时间:2011-03-11 19:47:11

标签: powershell namespaces

我有一个包含两个名称空间的XML文档('default'名称空间和 xlink ):

  • 的xmlns = “HTTP://大使馆/模式/ dudezilla /”
  • 的xmlns:的xlink = “http://www.w3.org/1999/xlink”

如何在PowerShell代码中指定“两个”命名空间? PowerShell似乎需要默认命名空间的前缀。我该怎么做?

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

    [System.Xml.XmlNamespaceManager] $nsmgr = $xml.NameTable;
    $nsmgr.AddNamespace('?','http://embassy/schemas/dudezilla/');
    [System.Xml.XmlNamespaceManager] $nsmgr = $xml.NameTable;
    $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;
    }

谢谢!

2 个答案:

答案 0 :(得分:18)

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
}

答案 1 :(得分:0)

想出来。不得不使用$ 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;
    }