2

ドキュメントにエラーが含まれているため、実際に[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

しかし、これはファイル内のあらゆる場所の文字を置き換えます。私は <company> のような xml タグ内の文字をチェックし、それらを 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 に答える