Как с помощью PowerShell добавить несколько пространств имен (одно из которых является пространством имен по умолчанию)? - PullRequest
11 голосов
/ 11 марта 2011

У меня есть XML-документ, который содержит два пространства имен (пространство имен по умолчанию и 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 ]

18 голосов
/ 12 марта 2011

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
}
0 голосов
/ 11 марта 2011

Разобрался. Пришлось использовать $ null для префикса пространства имен по умолчанию ($ null эквивалентно String.Empty в C #).

Рабочий код:

    [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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...