2010-02-24 93 views
4

如何从指定目录中获取多个XML文件的列表,并且为每个文件使用powershell在第二个根节点下添加一个元素?使用powershell编辑多个XML文件

例子: 我想第一<Names>元素中添加<LastName>SomeName</LastName>

<People> 
    <Names> 
     <FirstName>someFirstName</FirstName> 
    </Names> 
    <Names> 
     <FirstName>myFirstName</FirstName> 
     <Address>SomeAddress</Address> 
    </Names> 
</People> 

将变为:

<People> 
    <Names> 
     <LastName>SomeName</LastName> 
     <FirstName>someFirstName</FirstName> 
    </Names> 
    <Names> 
     <FirstName>myFirstName</FirstName> 
     <Address>SomeAddress</Address> 
    </Names> 
</People> 
+0

在PowerShell中您可以使用的唯一工具? – ghostdog74 2010-02-24 09:37:15

+0

不,powershell不是我可以使用的唯一工具。只是认为这将是最容易使用。你能推荐别的吗? – Draco 2010-02-24 11:06:19

回答

6

可以使用CreateElementAppendChild方法去做

Get-ChildItem c:\temp\ *.xml | 
    % { 
     $xml  = [xml](Get-Content $_.fullname) 
     $lastName = $xml.CreateElement('LastName') 
     $lastName.PsBase.InnerText = 'SomeName' 
     $null  = $xml.People.Names[0].AppendChild($lastName) 
     $xml.Save($_.FullName) 
    } 

我ñ情况下运行的PowerShell V2,你并不需要使用属性PsBase

 $lastName.InnerText = 'SomeName' 

有肯定的其他方式,但是这是一个非常简单。


如果该节点将是XML更深,你可以使用XPath这样的(包括发现第一Names节点):

$node = (Select-Xml -Xml $x -XPath '//Names[1]').Node 
$node = (Select-Xml -Xml $x -XPath '//Names[position()=1]').Node 
+0

呃,你应该在这个答案中真正摆脱提到正则表达式的那一行。在这之前我们已经走过了许多路,所以在处理XML时它不是一个选项。 – Joey 2010-02-24 11:26:35

+0

完成。同意你的看法,但对于某些用户来说,这可能是选择。我甚至可以用'' SomeName'替代第一次出现的'',然后将它重新格式化为xml。 * Hack * – stej 2010-02-24 11:45:09

+0

运行脚本时出现此错误: “无法在此对象上找到属性'InnerText';请确保它存在且可设置。” 它可能是我的Powershell版本吗? – Draco 2010-02-24 11:46:29