2015-12-20 46 views
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']"
但是不會返回任何東西。有什麼建議麼?

回答

0

使用以下XPath返回只有最後現有server元素:

因爲相應 server元素的內部文本是不完全等於 "cfusion2"
/clusters/cluster/server[last()] 

/clusters/cluster/server[text()='cfusion2']沒有可能的工作。有你沒有考慮的空白。嘗試使用normalize-space()做比較之前,清理不必要的空格,就像這樣:

/clusters/cluster/server[normalize-space()='cfusion2'] 
+0

har07的答案固定的XPath的問題,現在要麼這些都得到正確的元素$ OLDSERVER。不幸的是,現在當我嘗試InsertAfter()方法時,出現以下錯誤:使用「2」參數調用「InsertAfter」的異常:「參考節點不是此節點的子節點。在行:1 char:1 + $ clusterData.InsertAfter($ newServer,$ oldServer)+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException –

+0

@RichHopkins在你想要的父元素上調用'InsertAfter()'插入節點,如下所示:'$ clusterData.clusters.cluster.InsertAfter($ newServer,$ oldServer)' – har07

+0

奇怪的是,當我將$ clusterData.clusters.cluster傳遞給Get-Member時,我想我沒有看到這個方法可用,但是這有竅門,謝謝! –