Using PowerShell, how do I add multiple namespaces (one of which is the default namespace)?

后端 未结 2 787
慢半拍i
慢半拍i 2020-12-19 01:00

I have an XML document that contains two namespaces (the \'default\' namespace and xlink):

  • xmlns=\"http://embassy/schemas/dudezilla/\"
相关标签:
2条回答
  • 2020-12-19 01:14

    Figured it out. Had to use $null for the prefix of the default namespace ($null is equivalent to String.Empty in C#).

    Working code:

        [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;
        }
    
    0 讨论(0)
  • 2020-12-19 01:22

    PowerShell v2 makes this simpler:

    $ns = @{
             dns="http://embassy/schemas/dudezilla/"
             xlink="http://www.w3.org/1999/xlink"
           }
    
    $xml | Select-Xml '//dns:image/@xlink:href' -Namespace $ns
    

    If you want to do it the other way try:

    $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
    }
    
    0 讨论(0)
提交回复
热议问题