从XML获取多个文本元素

时间:2014-04-01 13:27:27

标签: xml powershell

如何在PowerShell中从XML文档中获取多个文本元素?

以下是一个例子:

<log>
  <logentry revision="152">
    <author>me</author>
    <date>2014-03-28T14:54:27.443978Z</date>
    <msg>Summary 1

* Note 1
* Note 2</msg></logentry>
  <logentry revision="153">
    <author>me</author>
    <date>2014-03-28T16:24:43.438847Z</date>
    <msg>Summary 2</msg>
  </logentry>
  <logentry revision="154">
    <author>me</author>
    <date>2014-03-31T16:00:01.590373Z</date>
    <msg>Summary 3</msg>
  </logentry>
  <logentry revision="155">
    <author>me</author>
    <date>2014-04-01T09:28:09.744015Z</date>
    <msg>Summary 4

* Note 3
* Note 4
    </msg>
  </logentry>
</log>

对于特定修订,这是svn log的输出。自上次运行脚本以手动汇总到文本文件以来,我想简化日志消息。我可以读取现有文件,解析最后一个版本并为新版本调用svn log。我想获得上述XML文档的以下文本输出:

Summary 1
* Note 1
* Note 2
Summary 2
Summary 3
Summary 4
* Note 3
* Note 4

另请注意每个“logentry / msg”元素中的最终换行符不一致。所有空行都应删除,但必须保留所有其他换行符。此外,每个“msg”元素必须在一个新行中,而不是在一个输出行中粘合在一起的多个消息(我现在有这种情况)。

这是我目前的代码:

$newMsgs = ($xml.log.logentry.msg).Replace("`n`n", "`n").Trim()

但它没有将每个“msg”放在一个单独的行中。此外,我不明白它究竟做了什么,何时它会破裂。我熟悉C#中的BCL,但并不熟悉PowerShell及其解决问题的方法。

1 个答案:

答案 0 :(得分:2)

您可以轻松地在新行字符上拆分消息,然后过滤掉没有任何内容的行。如果你想删除只包含空格的行,你可以在过滤之前修剪它们。这是一个例子:

$xml.log.logentry.msg -split "`n" | Foreach { $_.Trim() } | Where { $_ }

作为旁注,您的示例x​​ml中有一个小错误。第一个msg元素永远不会关闭。

以下是使用您的示例x​​ml并使用上述脚本过滤的完整示例:

[xml]$xml = @"
<log>
  <logentry revision="152">
    <author>me</author>
    <date>2014-03-28T14:54:27.443978Z</date>
    <msg>Summary 1

* Note 1
* Note 2</msg>
  </logentry>
  <logentry revision="153">
    <author>me</author>
    <date>2014-03-28T16:24:43.438847Z</date>
    <msg>Summary 2</msg>
  </logentry>
  <logentry revision="154">
    <author>me</author>
    <date>2014-03-31T16:00:01.590373Z</date>
    <msg>Summary 3</msg>
  </logentry>
  <logentry revision="155">
    <author>me</author>
    <date>2014-04-01T09:28:09.744015Z</date>
    <msg>Summary 4

* Note 3
* Note 4
    </msg>
  </logentry>
</log>
"@

$xml.log.logentry.msg -split "`n" | Foreach { $_.Trim() } | Where { $_ }

这会产生请求的输出:

Summary 1
* Note 1
* Note 2
Summary 2
Summary 3
Summary 4
* Note 3
* Note 4
相关问题