如何在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及其解决问题的方法。
答案 0 :(得分:2)
您可以轻松地在新行字符上拆分消息,然后过滤掉没有任何内容的行。如果你想删除只包含空格的行,你可以在过滤之前修剪它们。这是一个例子:
$xml.log.logentry.msg -split "`n" | Foreach { $_.Trim() } | Where { $_ }
作为旁注,您的示例xml中有一个小错误。第一个msg
元素永远不会关闭。
以下是使用您的示例xml并使用上述脚本过滤的完整示例:
[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