2011-06-15 70 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