gpt4 book ai didi

xml - Powershell:从函数正确返回XML

转载 作者:行者123 更新时间:2023-12-03 01:30:13 25 4
gpt4 key购买 nike

我正在研究执行XML操作的Powershell脚本,因为它动态地将子节点添加到现有XML字符串中。我有一个问题来“捕获”函数的返回值。我已经阅读并知道,在Powershell中没有返回值之类的东西,但是仍然无法正确访问操纵的XML。

这是代码:

function changeXML{Param ([xml]$xmlCall)

$newNode = '<?xml version="1.0" encoding="UTF-8"?><test>123</test>'
[xml]$newNodeXML = $newNode;

$node = $newNodeXML.SelectSingleNode("//test");

$newNode = $xmlCall.ImportNode($node, $true);

$xmlCall.SelectSingleNode("//request").AppendChild($newnode);

Write-Host $xmlCall.getType(); # ==> System.Xml.XmlDocument
Write-Host $xmlCall.innerXML; # This shows the correct XML on the console output

}

$xmlCall = '<?xml version="1.0" encoding="UTF-8"?>
<request>
<authentication>xyz</authentication>
</request>';

#manipulate XML
changeXML -xmlCall $xmlCall;

Write-Host $xmlCall.getType(); # ==> System.String
Write-Host $xmlCall.innerXML; # ==> Empty

该代码已简化,但实际上代表了所有操作。因此,它看起来有些复杂,但实际上,我(应该)需要做所有事情,如示例中所示。

我的问题是,在调用函数 changeXML之后,我无法访问操纵的XML。当我在函数内部执行 Write-Host $xmlCall.innerXML时,看起来不错。但是当函数完成后执行 Write-Host $xmlCall.innerXML时,它为空。我知道这个问题可能源于这样一个事实:变量 $xmlCall最初是一个字符串,但随后在函数内部是XML类型。但是,我找不到解决此问题的方法。

我的问题是:$xmlCall函数完成后,如何访问可操作的 changeXML变量?

最佳答案

$xmlCall块中定义的param仅存在于函数的范围内,并且您从不从函数输出$xmlCall的值。为此,请使用Write-Outputreturn或仅在函数定义中保留对$xmlCall的引用:

function Update-XML
{
param(
[xml]$xmlCall
)

$newNode = '<?xml version="1.0" encoding="UTF-8"?><test>123</test>'
[xml]$newNodeXML = $newNode;

$node = $newNodeXML.SelectSingleNode("//test");

$newNode = $xmlCall.ImportNode($node, $true);

# suppress output from AppendChild()
[void]$xmlCall.SelectSingleNode("//request").AppendChild($newnode)

# return value of $xmlCall
return $xmlCall
}

如果将实际的 XmlDocument传递给函数,则会发现传递的原始文档将反射(reflect)对该函数所做的更改,因此设计函数的一种更好的方法可能是仅在调用者要求时返回 $xmlCall。 :

function Update-XML
{
param(
[xml]$xmlCall,
[switch]$PassThru
)

$newNode = '<?xml version="1.0" encoding="UTF-8"?><test>123</test>'
[xml]$newNodeXML = $newNode;

$node = $newNodeXML.SelectSingleNode("//test");

$newNode = $xmlCall.ImportNode($node, $true);

# suppress output from AppendChild()
[void]$xmlCall.SelectSingleNode("//request").AppendChild($newnode)

if($PassThru){
# return value of $xmlCall
return $xmlCall
}
}

与字符串输入一起使用的示例:

$xmlString = '<?xml version="1.0" encoding="UTF-8"?><request><authentication>xyz</authentication></request>'

$updatedXmlDocument = Update-XML $xmlString -PassThru

# now you can reference $updatedXmlDocument.innerXml

与现有 XmlDocument引用一起使用的示例:

$xmlDoc = [xml]'<?xml version="1.0" encoding="UTF-8"?><request><authentication>xyz</authentication></request>'

Update-XML $xmlDoc

# now $xmlDoc.innerXml reflects the changes made in the function

关于xml - Powershell:从函数正确返回XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58916523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com