2

我正在尝试使用 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 标签内的字符(如 <company>)感兴趣,并将它们替换为 xml 安全实体,以便生成的文本是我可以使用 [xml] 加载的有效文档。

4

2 回答 2

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

于 2013-05-10T01:53:48.337 回答
1

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

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

$str -replace '(?is)(?<=<company>.*?)&(?=.*?</company>)', '&amp;'
于 2013-05-10T01:16:17.350 回答