【问题标题】:Using PowerShell, how do I add multiple namespaces (one of which is the default namespace)?使用 PowerShell,如何添加多个命名空间(其中一个是默认命名空间)?
【发布时间】:2018-07-25 16:45:36
【问题描述】:

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

  • xmlns="http://embassy/schemas/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;
    }

谢谢!

【问题讨论】:

    标签: powershell namespaces


    【解决方案1】:

    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 { $_.node.InnerXML }
    • 任何人都可以解释为什么 $xml.NameTable 工作,即使在 PowerShell 中的 [System.Xml.XmlDocument] 对象上没有 NameTable 成员?
    • 它有助于 Powershell 错误消息“Select-Xml:需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。”使用命令Select-Xml -Xpath '//test'
    【解决方案2】:

    想通了。必须使用 $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;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多