您发布的代码应该会引发一堆错误,因为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')
太谢谢你了。是的,我收到了像你提到的错误。以上工作很好。 –