【问题标题】:PowerShell $xml.NameTable is nullPowerShell $xml.NameTable 为空
【发布时间】:2013-01-10 06:10:11
【问题描述】:

我有一个 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-Xml 和$xmlDoc.SelectNodes。我能得到它的唯一方法是使用:

    $xmlDoc.Members

【问题讨论】:

  • 也许我在这里遗漏了一些东西。在$ns = new-object Xml.XmlNamespaceManager $xml.NameTable 中,您使用$xml 变量,而您的xmldoc 实际上是$xmlDoc
  • @Graimer 这就是我发现使用的示例 - 我不确定它是否应该是 $xmlDoc 或者 $xml 是否是内置的
  • @Graimer 我尝试将其更改为 $xmlDoc 并解决了问题。您能否提供上述回复作为答案,以便我将其标记为答案?故事的寓意 - 仅仅因为其他人说代码有效并不意味着他们实际上已经为您提供了有效的代码;)
  • 没有内置,正常调用 $xml 的 xml 内容 :)

标签: xml powershell


【解决方案1】:

试试:

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")

修正错字。

【讨论】:

    【解决方案2】:

    尝试像这样使用Select-Xml:

    $ns = @{ns0='http://my.domain.com/subsite'}
    $xml | Select-Xml -XPath '//ns0:Members' -Namespace $ns
    

    【讨论】:

    • 谢谢 :) 一旦我将 $xml 更改为 $xmlDoc,您的回答也对我有用。
    猜你喜欢
    • 2017-11-12
    • 2020-11-28
    • 2021-09-15
    • 1970-01-01
    • 2022-01-14
    • 2021-04-12
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多