首页 > 解决方案 > Powershell 每第 N 行更改一次 XML 元素

问题描述

我有一个 xml 文件,其中每个元素的格式如下:

    <ScriptEvent xsi:type="Event">
      <_time>0</_time>
    </ScriptEvent>
    <ScriptEvent xsi:type="Event">
      <_time>1</_time>
    </ScriptEvent>
    <ScriptEvent xsi:type="Event">
      <_time>2</_time>
    </ScriptEvent>
    <ScriptEvent xsi:type="Event">
      <_time>3</_time>
    </ScriptEvent>

我想知道如何像这样更改xml:

  1. 我们将有一个变量“count”,这是我们将用来替换当前“_time”元素的值
  2. 每两个 ScriptEvent 元素,此计数将增加一。

例如,预期的输出文件将如下所示:

    <ScriptEvent xsi:type="Event">
      <_time>0</_time>
    </ScriptEvent>
    <ScriptEvent xsi:type="Event">
      <_time>0</_time>
    </ScriptEvent>
    <ScriptEvent xsi:type="Event">
      <_time>1</_time>
    </ScriptEvent>
    <ScriptEvent xsi:type="Event">
      <_time>1</_time>
    </ScriptEvent>

我对powershell不是很好,有人可以帮我想一个可行的powershell脚本吗?我拥有的 xml 文件实际上有很多这些 ScriptEvent 元素(超过 400k)。

非常感谢。

标签: xmlpowershell

解决方案


这是一个简化的示例,它利用了PowerShell[xml]对类 ( System.Xml.XmlDocument)提供的 XML DOM的便捷适配:

# Parse XML text into a DOM.
[xml] $xmlDoc = @'
<root xmlns:xsi="http://example.org" >    
    <ScriptEvent xsi:type="Event">
      <_time>0</_time>
    </ScriptEvent>
    <ScriptEvent xsi:type="Event">
      <_time>1</_time>
    </ScriptEvent>
    <ScriptEvent xsi:type="Event">
      <_time>2</_time>
    </ScriptEvent>
    <ScriptEvent xsi:type="Event">
      <_time>3</_time>
    </ScriptEvent>
</root>    
'@

# Loop over all <ScriptElement> children of the <root> element
# and update their <_time> values.
$i = 0; $count = 0
foreach ($el in $xml.root.ScriptEvent) {
  $el._time = $count
  if ($i++ % 2) { ++$count }
}

有关如何从文件加载 XML 以及如何在保存回文件时进行漂亮打印的信息,请参阅此答案


推荐阅读