Powershell Regex替换XML标记值

时间:2013-05-10 00:39:35

标签: xml regex powershell

我正在尝试使用Powershell从文件解析XML,而不使用[xml]将其实际加载为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标签中的字符,例如&lt; company&gt;并用xml安全实体替换它们,以便生成的文本是我可以使用[xml]加载的有效文档。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

一些正则表达式的后视和前瞻应该可以解决这个问题:

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

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