0

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
4

1 に答える 1

0

RemoveChild()andAppendChild()メソッドは問題の子ノードを返し、出力を汚染します。

出力を抑制すれば問題ありません。

$null = $oldnode.ParentNode.AppendChild($importNode)
$null = $oldnode.ParentNode.RemoveChild($oldnode)
于 2016-03-20T14:17:52.610 に答える