首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell New-Object :找不到构造函数

Powershell New-Object :找不到构造函数
EN

Stack Overflow用户
提问于 2020-06-09 01:48:12
回答 1查看 1.4K关注 0票数 1

我正在尝试创建一个函数来获取de NameSpaceManager,但是我得到了一条错误消息,并且不知道为什么。

代码语言:javascript
复制
 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   

}

跟随消息:

代码语言:javascript
复制
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返回:

代码语言:javascript
复制
PS C:\Path\To\Myfiles> $xmlNsManager

xmlns xml ns

谢谢你的帮助。

这是我的代码的一部分:

代码语言:javascript
复制
 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}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-09 02:14:39

代码语言:javascript
复制
New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
                                         "~~~~~~~~~~~~~~~"

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

代码语言:javascript
复制
$xmlNsManager

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

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

)

如果我运行该函数,但将$xml参数放在下面这样:

代码语言:javascript
复制
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>
"@

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

代码语言:javascript
复制
xmlns
xml
ns

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

代码语言:javascript
复制
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   
}

所以现在如果我这样做

代码语言:javascript
复制
Get-XmlNamespaceManager

它会向我询问参数

代码语言:javascript
复制
cmdlet Get-XmlNamespaceManager at command pipeline position 1
Supply values for the following parameters:
xml:

如果我没有通过按enter键在其中输入参数,则会将$xml作为""传递。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62268187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档