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

标签 xml 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;

最佳答案

您发布的代码会引发很多错误,因为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/

    相关文章:

    powershell - 在多个文件的特定行上更改值

    javascript - 使用 Javascript 解析 XML

    python - lxml.etree 不能在 python 3 中使用 cdata

    xml - XML Schema 是 SGML DTD 的子集吗?

    c - 从 XML 文件中提取数据

    Powershell 测试路径然后删除项目但文件正在被另一个进程使用

    c# - 如何在 Windows 窗体应用程序中保存应用程序设置?

    powershell - 完全路径可执行文件时 PowerShell 中的“意外 token ”

    Powershell - 单击 div 中的 href 链接

    powershell - 使用启动过程调用其他Powershell文件时出现问题