0

我有一个 xml 文件,其中包含我希望使用 PowerShell 读取的带有命名空间的元素。

示例 XML:

    <ns0:Members xmlns:ns0="http://my.domain.com/subsite">
        <Member>
            <MemberDetails>
                <Name>Blah de Blah Blah</Name>
                <Email>blah@lost.com</Email>
            </MemberDetails>
        </Member>
    </Members>

从我在网上找到的一些示例中,我编写了以下 PowerShell 来读取 XML:

   function Get-ScriptDirectory
    {
        return Split-Path $script:MyInvocation.MyCommand.Path
    }

    $xmlFile = Join-Path (Get-ScriptDirectory) "MyXmlFile.xml"
    [xml]$xmlDoc = Get-Content $xmlFile         
    $ns = new-object Xml.XmlNamespaceManager $xml.NameTable
    $ns.AddNamespace("ns0", "http://my.domain.com/subsite")
    $node = $xmlDoc.SelectNodes("ns0:Members")

但是,我收到以下错误:

    New-Object : Constructor not found. Cannot find an appropriate constructor for type Xml.XmlNamespaceManager.

我在网上搜索了错误,但我发现的唯一帖子建议仔细检查 PowerShell 的版本是版本 2。

我跑了$Host.Version,这给了我:

    Major  Minor  Build  Revision
    -----  -----  -----  --------
    2      0      -1     -1

当我使用 PowerGui Editor 单步执行脚本时,我发现它$xml.NameTable是空的。

谁能解释为什么以及我能做些什么来解决它?

另一方面,我尝试选择Members元素的方法都没有奏效,包括Select-Xmland $xmlDoc.SelectNodes。我能得到它的唯一方法是使用:

    $xmlDoc.Members
4

2 回答 2

2

尝试Select-Xml像这样使用:

$ns = @{ns0='http://my.domain.com/subsite'}
$xml | Select-Xml -XPath '//ns0:Members' -Namespace $ns
于 2013-01-09T04:58:46.413 回答
2

尝试:

function Get-ScriptDirectory
    {
        return Split-Path $script:MyInvocation.MyCommand.Path
    }

    $xmlFile = Join-Path (Get-ScriptDirectory) "MyXmlFile.xml"
    [xml]$xmlDoc = Get-Content $xmlFile         
    $ns = new-object Xml.XmlNamespaceManager $xmlDoc.NameTable
    $ns.AddNamespace("ns0", "http://my.domain.com/subsite")
    $node = $xmlDoc.SelectNodes("ns0:Members")

修正错字。

于 2013-01-09T22:10:11.967 回答