2013-05-10 65 views
2

我試圖解析從使用PowerShell文件下面的XML,而無需使用[XML],因爲該文件包含錯誤實際加載它作爲XML文檔。Powershell的正則表達式替換XML標記值

<data> 
    <company>Walter & Cooper</company> 
    <contact_name>Patrick O'Brian</contact_name> 
</data> 

要順利加載的文件,我需要通過更換特殊字符來修復錯誤如下

& with &amp; 
< with &lt; 
' with &apos; etc.. 

我知道我可以做這樣的事情來查找和替換文檔中的文字

(Get-Content $fileName) | Foreach-Object { 
    $_-replace '&', '&amp;' ` 
    -replace "'", "&apos;" ` 
    -replace '"', '&quot;'} | Set-Content $fileName 

但是,這將在文件中到處替換字符,我只關心像<公司檢查XML標籤內的字符並用xml安全實體替換它們,以便生成的文本是可以使用[xml]加載的有效文檔。

回答

2

像這樣的東西應該爲每個字符工作,你需要更換:

$_-replace '(?<=\W)(&)(?=.*<\/.*>)', '&amp' ` 
    -replace '(?<=\W)(')(?=.*<\/.*>)', '&apos;' ` 
    -replace '(?<=\W)(")(?=.*<\/.*>)', '&quot;' ` 
    -replace '(?<=\W)(>)(?=.*<\/.*>)', '&gt;' ` 
    -replace '(?<=\W)(\*)(?=.*<\/.*>)', '&lowast;' } | Set-Content $fileName 

這確實一個非單詞字符的正面後視,然後是捕捉組,然後是積極的預見。

例子:

更新:http://regex101.com/r/aY8iV3 | 原創:http://regex101.com/r/yO7wB1

+0

謝謝,這項工作很好,但在符號值內出現任何特殊字符的角落情況下也會出現< and >符號。 故障測試案例&*>「<'_ @ Raj 2013-05-10 18:01:06

+0

@Raj - 對於符號''< >你可以做一個積極的外觀,背後有一個非字字符'\ W',然後用一個捕獲組繼續積極的展望,我已經更新了答案/例子。 – 2013-05-10 23:31:08

1

正則表達式查找後面的一點點前瞻應該做的伎倆:

$str = @' 
<data> 
    <company>Walter & Cooper & Brannigan</company> 
    <contact_name>Patrick & O'Brian</contact_name> 
</data> 
'@ 

$str -replace '(?is)(?<=<company>.*?)&(?=.*?</company>)', '&amp;'