1
我有我試圖插入新的節點到一個XML架構:插入一個新的節點轉換成XML使用PowerShell
<clusters>
<cluster>
<name>
cfcluster
</name>
<port>
45564
</port>
<sessionreplication>
true
</sessionreplication>
<server>
cfusion1
</server>
<server>
cfusion2
</server>
<stickysession>
true
</stickysession>
</cluster>
</clusters>
我試圖寫有一個新的服務器值的腳本,將檢查它與現有的檢查,然後插入新的一個如果沒有找到現有的。例如說我有一個新的服務器值cfusion3,我想我的新的輸出落得這樣的:
<clusters>
<cluster>
<name>
cfcluster
</name>
<port>
45564
</port>
<sessionreplication>
true
</sessionreplication>
<server>
cfusion1
</server>
<server>
cfusion2
</server>
<server>
cfusion3
</server>
<stickysession>
true
</stickysession>
</cluster>
</clusters>
假設我有存儲在$ Cluster數據和新的服務器我要插入的XML存儲在$ cfInstance.name,我想我會用這樣的事情,但不能得到它的工作...
if (-not ($clusterData.clusters.cluster.server -match $cfInstance.name)) {
$oldServer = ($clusterData | Select-Xml '/clusters/cluster/server').get_node()
$newServer = $clusterData.CreateElement("server")
$newServer.InnerText = $cfInstance.name
$clusterData.InsertAfter($newServer, $oldServer)
}
我敢肯定,問題是$oldServer
是讓所有<server>
節點我不知道如何修改xpath
以獲得一個。我試過了:Select-Xml -Xml $clusterData -XPath "clusters/cluster/server[text()='cfusion2']"
但是不會返回任何東西。有什麼建議麼?
har07的答案固定的XPath的問題,現在要麼這些都得到正確的元素$ OLDSERVER。不幸的是,現在當我嘗試InsertAfter()方法時,出現以下錯誤:使用「2」參數調用「InsertAfter」的異常:「參考節點不是此節點的子節點。在行:1 char:1 + $ clusterData.InsertAfter($ newServer,$ oldServer)+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException –
@RichHopkins在你想要的父元素上調用'InsertAfter()'插入節點,如下所示:'$ clusterData.clusters.cluster.InsertAfter($ newServer,$ oldServer)' – har07
奇怪的是,當我將$ clusterData.clusters.cluster傳遞給Get-Member時,我想我沒有看到這個方法可用,但是這有竅門,謝謝! –