【问题标题】:Powershell New-Object : A constructor was not foundPowershell New-Object:找不到构造函数
【发布时间】:2020-06-09 03:14:35
【问题描述】:

我正在尝试创建一个函数来获取名称空间管理器,但我收到一条消息错误并且不明白为什么。

 function Get-XmlNamespaceManager([ xml ]$xml, [string]$NamespaceURI = "")
{

if ([string]::IsNullOrEmpty($NamespaceURI)) { $NamespaceURI = $xml.DocumentElement.NamespaceURI            }


[System.Xml.XmlNamespaceManager]$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$xmlNsManager.AddNamespace("ns", $NamespaceURI)
return ,$xmlNsManager   

}

以下消息:

New-Object : A constructor was not found. Cannot find an appropriate constructor for type   System.Xml.XmlNamespaceManager.
At C:\Scripts\Add Archive Handle\Add_Archive_Handle.ps1:35 char:53
+ ... NsManager = New-Object System.Xml.XmlNamespaceManager($xml.NameTable) ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : CannotFindAppropriateCtor,Microsoft.PowerShell.Commands.NewObjectCommand

但我的 $xmlNsManager 返回:

PS C:\Path\To\Myfiles> $xmlNsManager

xmlns xml ns

感谢您的帮助。

这是我的代码的一部分:

 Get-ChildItem -Path 'C:\Scripts\Add Archive Handle\Source\' -Recurse -Include "*.imdi" -File | ForEach-Object {


 $NodePath = $xml.METATRANSCRIPT.Session.Resources.MediaFile.ResourceLink,$xml.METATRANSCRIPT.Session.Resources.WrittenResource.ResourceLink


 [xml]$xml = Get-Content $_.FullName; 
 $xml= $xml.METATRANSCRIPT.OuterXml;
 $xmlAtt = $xml.CreateAttribute("ArchiveHandle")
 $dt = $xml.METATRANSCRIPT.Attributes.GetNamedItem('Date')
 $xmlAtt = $xml.METATRANSCRIPT.Attributes.InsertBefore($xmlAtt, $dt);



   function Get-XmlNamespaceManager([ xml ]$xml, [string]$NamespaceURI =""){

  if ([string]::IsNullOrEmpty($NamespaceURI)) { $NamespaceURI = $xml.DocumentElement.NamespaceURI }
[System.Xml.XmlNamespaceManager]$xmlNsManager =New-Object  System.Xml.XmlNamespaceManager($xml.NameTable)
$xmlNsManager.AddNamespace("ns", $NamespaceURI)
return ,$xmlNsManager }

   function Get-FullyQualifiedXmlNodePath([string]$NodePath, [string]$NodeSeparatorCharacter = '.'){
   return "/ns:$($NodePath.Replace($($NodeSeparatorCharacter), '/ns:'))"}

   function Get-XmlNode([ xml ]$xml, [string]$NodePath, [string]$NamespaceURI = "", [string]$NodeSeparatorCharacter = '.'){
$xmlNsManager = Get-XmlNamespaceManager -XmlDocument $xml -NamespaceURI  $NamespaceURI
[string]$fullyQualifiedNodePath = Get-FullyQualifiedXmlNodePath -NodePath $NodePath -NodeSeparatorCharacter $NodeSeparatorCharacter  
$node = $xml.SelectSingleNode($fullyQualifiedNodePath, $xmlNsManager)
return $node}}

【问题讨论】:

    标签: xml powershell


    【解决方案1】:
    New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
                                             "~~~~~~~~~~~~~~~"
    

    这是特定错误的位置。这并没有具体的错误,但它只是因为您调用函数的方式而成为错误。

    $xmlNsManager
    

    您可能知道(因为您创建了我假设的函数)该函数有两个参数($xml$namespaceuri)。 $namespaceuri 可以是 null 并且不是强制性的,但是尽管您没有指定 $xml 是强制性的,但这是因为您必须使用它。 (

    if ([string]::IsNullOrEmpty($NamespaceURI)) {$NamespaceURI = $xml.DocumentElement.NamespaceURI}
    #                                                          here ^
    [System.Xml.XmlNamespaceManager]$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
    #                                                                                   and here^
    

    )

    如果我运行该函数,但我将$xml 参数设置为:

    Get-XmlNamespaceManager -xml @"
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE Identity PUBLIC "point.dtd" "point.dtd"[]>
    <Identity  created="1525465321820" name="Onboarding - GUI - External">
      <Attributes>
        <Map>
          <entry key="displayName" value="Onboarding - GUI " />
          <entry key="firstname" value="Z Orphaned ID" />
        </Map>
      </Attributes>
    </Identity>
    "@
    

    我没有收到错误,而是得到了输出:

    xmlns
    xml
    ns
    

    我不知道这是否是您想要的输出,但是由于参数为空而导致错误。为保证$xml 是必需的,您可以这样做:

    function Get-XmlNamespaceManager([parameter(Mandatory=$true)][xml]$xml, [string]$NamespaceURI = "")
    {
    if ([string]::IsNullOrEmpty($NamespaceURI)) {$NamespaceURI = $xml.DocumentElement.NamespaceURI}
    
    [System.Xml.XmlNamespaceManager]$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
    $xmlNsManager.AddNamespace("ns", $NamespaceURI)
    return ,$xmlNsManager   
    }
    

    如果我这样做了,那么现在

    Get-XmlNamespaceManager
    

    它会问我参数

    cmdlet Get-XmlNamespaceManager at command pipeline position 1
    Supply values for the following parameters:
    xml:
    

    如果我不按enter 在那里输入参数,这会将$xml 传递为""

    【讨论】:

    • 嗨 Neko,感谢您的帮助和解释,您说得对,这是我的预期输出,但没有在管道上输入 xml 值。它将返回输出并在另一个函数中使用。
    • 它不会在另一个函数中使用只是你的函数似乎总是返回相同的东西。尝试使用新窗口或@987654339重置powershell范围@ 命令并再次运行该函数。还是一样。
    • 在没有$global: 的函数中定义的所有变量在它之外的环境中都不会改变。例如,创建函数function myfunc{$test = "test"} 并运行它,看看$test 是否可以在函数之外使用,然后尝试使用function myfunc{$global:test = "test"},看看是否可以在函数之外使用$test
    猜你喜欢
    • 2021-01-02
    • 2013-09-23
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多