2014-04-01 160 views
0

如何從PowerShell中的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> 

這是svn log特定版本的輸出。自從上一個腳本運行手動彙總到文本文件以來,我想簡化日誌消息。我可以讀取現有文件,解析上一個修訂版本併爲新版本調用svn log。我想獲得以上XML文檔中的下列文本輸出:

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

還要注意在每個「logentry /味精」元素的不一致最終換行符。所有空行都應該被刪除,但所有其他換行必須保留。另外,每個「msg」元素必須放在一個新行中,而不是將多個消息粘貼在一個輸出行中(現在我已經有了)。

這裏是我當前的代碼:

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

但它並不把每個「味精」,在一個單獨的行。此外,我不明白它究竟發生了什麼,什麼時候會中斷。我熟悉C#中的BCL,但不是那麼多的PowerShell和它自己的解決方法。

回答

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 
+0

的XML錯誤必須是一個錯字,因爲我已經複製它脫離了控制檯窗口。所以你的命令給了我一串字符串,我想每行一個。我怎樣才能將它轉換成一個帶有一致的換行符的字符串,並將它與以前的內容一起寫回文件? – ygoe

+0

你想把它加回到XML中,然後保存?當你說「一致的換行符」時,你是否期望回車換行和換行符,或者只是換行符,或者不管它是混合還是混合,只要它們位於正確的位置? –

+0

不,我只是使用XML作爲源代碼,但是將所有內容寫入純文本文件。 SVN也可以給我純文本,但XML應該更安全的解析。我更喜歡CRLF,因爲這是Windows使用的,SVN似乎只返回LF。現在我有兩個醜陋的混合,並且在「味精」項目之間缺少換行符。但是用一些Replace()調用來清理已存在的換行符應該很容易。 – ygoe