【问题标题】:Powershell Change XML Element Every Nth LinePowershell 每第 N 行更改一次 XML 元素
【发布时间】:2021-09-09 04:57:30
【问题描述】:

我有一个 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)。

非常感谢。

【问题讨论】:

    标签: xml powershell


    【解决方案1】:

    这是一个简化的示例,它利用了[xml] 类(System.Xml.XmlDocument)提供的 XML DOM 的PowerShell's convenient adaptation

    # 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 以及如何在保存回文件时进行漂亮打印的信息,请参阅this answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2011-10-16
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 2016-02-22
      相关资源
      最近更新 更多