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



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

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:ScriptsAdd Archive HandleAdd_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:PathToMyfiles> $xmlNsManager

xmlns .xml 纳

感谢您的帮助。

这是我代码的一部分:

Get-ChildItem -Path 'C:ScriptsAdd Archive HandleSource' -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}}
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传递为"".

最新更新