2010-02-24 95 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