繁体   English   中英

如何使用PowerShell编辑和保存XML节点

[英]How to Edit and Save XML nodes with PowerShell

我似乎无法让这个工作。 我想使用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;

您需要遍历管道中的结果。 搜索汽车有多个结果。 最后,你需要% {$_.Node.Text}而不是Write-Host $_.InnerText; % {$_.Node.Text} Write-Host $_.InnerText;

%For-Each Object的快捷方式。 所以它基本上遍历每个条目并显示您需要的信息。

这是我如何处理这个问题。

首先,从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')

正如你所看到的,我只会写一个静态文本, 我的汽车文本......但你可以根据自己的需要定制它。

您发布的代码应该抛出一堆错误,因为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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM