2011-06-15 72 views
4

我在嘗試使用PowerShell重命名XML節點。例如:
<configuration>
<desktops>
<name>PC001</name>
<domain>CORP</domain>
</desktops>
<laptops>
<name>PC002</name>
<domain>CORP</domain>
</laptops>
</configuration>如何使用PowerShell重命名XML節點?

我想將第一個<name>標記重命名爲<PC1name>(分別爲</PC1name>)。這裏是我有,到目前爲止:?

$InputFile = "NetworkConfigs.xml"
$xml = [xml](get-content $InputFile)
$root = $xml.get_DocumentElement();
#replace the node
$ root.desktops.name`

$xml.Save($InputFile)

我不知道如何更換帶別的東西的標籤。提示?

回答

6

底線,XML節點的名稱是不可變的。參考文獻msdn

下面是使用所需數據創建新節點的快速示例。希望能幫助到你。

$InputText = @" 
<configuration> 
<desktops> 
<name>PC001</name> 
<domain>CORP</domain> 
</desktops> 
<laptops> 
<name>PC002</name> 
<domain>CORP</domain> 
</laptops> 
</configuration> 
"@ 

$xml = [xml]($inputText) 
$desktopsNode = [System.Xml.XmlElement]$xml.configuration.desktops 
$nameNode = $desktopsNode.SelectSingleNode('name') 
$pcNameNode = $xml.CreateElement('PC1Name') 
$pcNameNode.InnerText = $nameNode.InnerText 
[void]$desktopsNode.AppendChild($pcNameNode) 
[void]$desktopsNode.RemoveChild($nameNode) 
$xml.OuterXML 

輸出:在XML

<configuration><desktops><domain>CORP</domain><PC1Name>PC001</PC1Name></desktops><laptops><name>PC002</n 
ame><domain>CORP</domain></laptops></configuration> 
+0

感謝codepoke。我會給這個鏡頭。 – craveness 2011-06-15 06:10:33

+0

這主要工作,我需要使用一個文件作爲輸入和輸出。所以,我用'$ InputFile'替換了'$ InputText',並應用了使用'$ xml.OuterXML'顯示的更改。但是,如何保存XML文件?我嘗試了'$ xml.Save($ InputFile)',但這不起作用。 – craveness 2011-06-15 17:39:39

+0

錯誤應該告訴你保存中出現了什麼問題。文件是否被鎖定?或者$ xml對象沒有Save方法? (如果是這樣的話,你需要得到一個System.Xml.XmlDocument的句柄。)關鍵是要仔細觀察錯誤信息並查看適當的對象文檔。 – codepoke 2011-06-19 17:25:49

2

重命名節點是比你想象的更復雜。如果節點是根節點,或者具有複雜的子節點層次結構的父節點,則尤其糟糕。我見過的大多數「重命名」方法都會克隆這些子項並將它們附加到新節點上。如果您的API還包含ReplaceChild方法,該過程會變得更加簡單。 (我可以提供詳細信息,如果您需要它們)。

我已經使用的另一種方法(特別是如果XML可以表示爲字符串)是在將XML轉換爲XmlDocument之前替換XML中的文本。

$InputText = @" 
<configuration> 
<desktops> 
<name>PC001</name> 
<domain>CORP</domain> 
</desktops> 
<laptops> 
<name>PC002</name> 
<domain>CORP</domain> 
</laptops> 
</configuration> 
"@ 

$regex = [regex]'(</?)name>' 
$ModifiedText = $regex.Replace($InputText,"`$1PC1Name>",2) 
$xml = [xml]$ModifiedText 

請注意,替換語句查找和修復匹配的前兩次出現 - 僅第一個元素的開始和結束標記。刪除號碼以查找並替換字符串中的所有匹配項。還要注意,正則表達式捕獲開始標記字符,以便它們可以作爲$ 1插入到字符串匹配中。

0
$oldtag = "name" 
$newtag = "PC1name" 
$xml = Get-Content D:\oldfile.xml 
$new = $xml -replace $oldtag, $newtag 
Set-content -path D:\newfile.xml -value $new 

我的方法是我將XML轉換爲字符串,然後替換節點(在這種情況下,這只是正常的字符串)。 它適合我。

+0

非常不好的解決方案...如果你的字符串碰巧出現在別的地方,那麼你正在犯一個錯誤 – JotaBe 2016-11-18 14:53:59