2017-09-25 121 views
1

我似乎無法得到此工作。我想使用PowerShell選擇特定類型的所有節點,編輯它們,然後保存回磁盤。如何使用PowerShell編輯和保存XML節點

這裏是開始XML文件:

<Cars> 
    <Car>Car1</Car> 
    <Car>Car2</Car> 
</Cars> 

這裏是被修改後的文件:

<Cars> 
    <Car Text="Car1"></Car> 
    <Car Text="Car2"></Car> 
</Cars> 

曾嘗試:

[xml]$xaml = Get-Content -Path "C:\Test\TranslationUtility\cars.xml" | 
      Select-Xml -XPath "//Car" | 
      Write-Host $_.InnerText; 

回答

2

您發佈的代碼應該會引發一堆錯誤,因爲Get-Content(不帶參數-Raw)會生成一個字符串數組,其中每個字符串本身都是無效的XML。喂入Select-Xml不起作用。此外,您使用[xml]型加速器和Write-Host是錯誤的。

憑經驗:

  • 如果你想使用Select-Xml讓它通過自身讀取文件(通過其-Path參數):

    $xpath = '//Car' 
    $xmlfile = 'C:\Test\TranslationUtility\cars.xml' 
    
    Select-Xml -Xpath $xpath -Path $xmlfile 
    
  • 如果你想使用Get-Content[xml]型加速器使用SelectNodes()方法:

    $xpath = '//Car' 
    $xmlfile = 'C:\Test\TranslationUtility\cars.xml' 
    
    [xml]$xml = Get-Content $xmlfile 
    $xml.SelectNodes($xpath) 
    

但是,由於您想要操作XAML文件,單靠這一點不會讓您達到預期的結果。請不要忽略您的問題中的重要信息。我只知道,因爲當你刪除它時,我正要回應你之前的問題。

XAML文件總是使用命名空間,所以你必須使用一個命名空間管理照顧,像這樣:

$xpath = '//ns:Car' 
$xmlfile = 'C:\Test\TranslationUtility\cars.xml' 
$ns = @{'ns' = 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'} 

Select-Xml -Xpath $xpath -Path $xmlfile -Namespace $ns

或像這樣:

$xpath = '//ns:Car' 
$xmlfile = 'C:\Test\TranslationUtility\cars.xml' 

[xml]$xml = Get-Content $xmlfile 

$nsm = New-Object Xml.XmlNamespaceManager($xml.NameTable) $nsm.AddNamespace("ns", $xml.DocumentElement.NamespaceURI) 

$xml.SelectNodes($xpath, $nsm)

由於要修改XML數據我可能會採用後一種方法。這允許您添加一個屬性是這樣的:

$i = 1 
$xml.SelectNodes($xpath, $nsm) | ForEach-Object { 
    [void]$_.SetAttribute('Text', "Car$i") 
    $i++ 
} 

通過Save()方法將修改後的XML:

$xml.Save('C:\path\to\output.xml') 
+0

太謝謝你了。是的,我收到了像你提到的錯誤。以上工作很好。 –

1

您需要通過結果來迭代在管線中。你有多個搜索汽車的結果。最後,您需要% {$_.Node.Text}而不是Write-Host $_.InnerText;

%For-Each Object的快捷方式。所以它基本上循環每個條目並顯示您需要的信息。

1

下面是我如何處理這個問題。

首先,您從xml文件獲取內容,然後使用SelectNodes查找所需的節點,迭代它們,創建屬性並分配值。

一旦完成,剩下的就是保存xml。

[xml]$MyXML = Get-Content 'C:\__tmp\YourXmlFile.xml' 

$Cars = $MyXML.SelectNodes('//Car') 

$Cars | foreach { 
$TextAttrib = $_.OwnerDocument.CreateAttribute('text') 
$_.Attributes.Append($TextAttrib) |Out-Null; 
$_.SetAttribute('text','My Car text...') 
} 

$MyXML.Save('C:\__tmp\YourXmlFile.xml') 

正如你所看到的,我的只寫一個靜態文本,我的車文字...,但你可以調整這個以滿足您的需求。