我正在尝试使用Powershell从文件解析XML,而不使用[xml]将其实际加载为XML文档,因为文档包含错误。
<data>
<company>Walter & Cooper</company>
<contact_name>Patrick O'Brian</contact_name>
</data>
要成功加载文档,我需要通过替换特殊字符来修复错误,如下所示
& with &
< with <
' with ' etc..
我知道我可以做这样的事情来查找和替换文档中的字符
(Get-Content $fileName) | Foreach-Object {
$_-replace '&', '&' `
-replace "'", "'" `
-replace '"', '"'} | Set-Content $fileName
但这会替换文件中的所有字符,我只想检查xml标签中的字符,例如&lt; company&gt;并用xml安全实体替换它们,以便生成的文本是我可以使用[xml]加载的有效文档。
答案 0 :(得分:2)
这样的事情应该适用于你需要替换的每个角色:
$_-replace '(?<=\W)(&)(?=.*<\/.*>)', '&' `
-replace '(?<=\W)(')(?=.*<\/.*>)', ''' `
-replace '(?<=\W)(")(?=.*<\/.*>)', '"' `
-replace '(?<=\W)(>)(?=.*<\/.*>)', '>' `
-replace '(?<=\W)(\*)(?=.*<\/.*>)', '∗' } | 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>)', '&'