我似乎无法使它正常工作。我想使用PowerShell选择特定类型的所有节点,对其进行编辑,然后保存回磁盘。
这是开始的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;
最佳答案
您发布的代码会引发很多错误,因为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文件始终使用 namespace ,因此您必须使用 namespace 管理器来完成此任务,如下所示:
$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')
关于xml - 如何使用PowerShell编辑和保存XML节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46413409/