XML を含むさまざまなキーを持つハッシュ テーブルを返す関数があります。また、この XML を返す前に修正するためのコードもいくつかあります。ただし、最初はパイプライン汚染の問題のように見えましたが、XML 置換コードに分離しました。
そのため、最初はすべての XML 置換を、 を使用してリターン ハッシュのキーで直接行いました$result.xml
。ただし、次のような別の変数を使用するようにコードを変更しました。
$revisedXml = $result.xml
$oldnode = $revisedXml.selectSingleNode("/Definitions/InstallTypes/InstallType[@id='$supersedes']")
$newnode = $temp.xml.selectSingleNode("/Definitions/InstallTypes/InstallType[@id='$supersedes']")
$importNode = $revisedXml.ImportNode($newnode, $true)
$oldnode.ParentNode.AppendChild($importNode)
$oldnode.ParentNode.RemoveChild($oldnode)
ただし、これらの最後の 2 行のいずれかが原因で、$return
ハッシュが爆発します。XML が値ではなく参照であることを覚えていると思います。そのため、私が実際に行っているのは、新しいポインターを介して直接 XML にアクセスすることです。 XML も参照します。これは正しいと思いますか、それとも私はすでに間違った道を進んでいますか?
また、おそらく関連しています。私が最終的にやろうとしているのは、特定のノードを$result.xml
および別の$temp.xml
(別のファイルからロードされた) で検索し、見つかった場合は のノードを のノードに置き換えること$result
です$temp
。を使用してみReplaceChild()
ましたが、うまくいかないようです。おそらく PowerShell 2.0 の問題です。
では、これらの 2 ビットのデータを使用して、XML を修正するより良い方法はありますか? また、XML を値で適切に渡す関数で機能させる方法はありますか? FWIW、私は正常に使用していたグローバル XML 変数を回避するためにリファクタリングしています。私は一般的にグローバル変数が好きではありませんが、おそらくこれは私がそれらを使用しなければならない状況の 1 つですか?
編集: そのため、問題を切り分けようとして、新しい問題に遭遇しました。ここでは、関数内に 2 つの XML 変数を作成し、ある変数のノードを別の変数のノードに置き換えて関数から戻し、結果が正しいことを確認するためにコンソールに書き込みます (違いは SilentModeID が9)。問題は、ここの 2 つの文字列が機能していないことです。一重引用符でも試しましたが、それでもエラーがスローされます。私の実際のコードではここで文字列を使用していないため、実際にはりんごに当てはまりません。ファイルから XML を読み取っていますが、議論の目的では、それがより良い方法のように思えました。それで、最初の新しい質問です。ここの文字列で一体何が間違っているのでしょうか? これが機能したら、XML の受け渡しが同じように壊れているかどうかを確認できます。
function Write-PxXmlToConsole ($xml) {
$stringWriter = New-Object System.IO.StringWriter
$xmlWriter = New-Object System.Xml.XmlTextWriter $stringWriter
$xmlWriter.Formatting = "indented"
$xml.WriteTo($xmlWriter)
$xmlWriter.Flush()
$stringWriter.Flush()
Write-Host $stringWriter.ToString()
}
function Import-PxXml {
$result = @{
success = $true
xml = $null
log = $null
}
[xml]$assets = @"
<?xml version="1.0"?>
<Definitions>
<InstallTypes>
<InstallType id="deployment">
<SilentModeID>1</SilentModeID>
</InstallTypes>
</InstallType>
</Definitions>
"@
[xml]$newAssets = @"
<?xml version="1.0"?>
<Definitions>
<InstallTypes>
<InstallType id="deployment">
<SilentModeID>9</SilentModeID>
</InstallType>
</InstallTypes>
</Definitions>
"@
$nodeName = 'deployment'
$oldnode = $assets.selectSingleNode("/Definitions/InstallTypes/InstallType[@id='$nodeName']")
$newnode = $newAssets.selectSingleNode("/Definitions/InstallTypes/InstallType[@id='$nodeName']")
$importNode = $assets.ImportNode($newnode, $true)
$oldnode.ParentNode.AppendChild($importNode)
$oldnode.ParentNode.RemoveChild($oldnode)
$result.xml = $assets
$result.log = 'Crossed Fingers'
return $result
}
$test = Import-PxXml
Write-PxXmlToConsole $test.xml