0

最終的に、XMLファイルの空でない要素をすべて次のようにラップしようとしています。

'<![CDATA[...]]>'

これが私のコードをテストしているサンプルです:

<currentTime4 dsi="user 2009/06/02 10:43">10:36</currentTime4>
<todayDate dsi="user 2009/06/02 10:43">06/02/2009</todayDate>
<todayDate3 dsi="user 2009/06/02 10:43">06/02/2009</todayDate3>
<todayDate4 dsi="user 2009/06/02 10:43">06/02/2009</todayDate4>
<currentTime dsi="user 2009/06/02 10:43">10:36</currentTime>
<Relationship dsi="user 2009/06/02 10:43"></Relationship>
<PatSignatureIII dsi="user 2009/06/02 10:43"></PatSignatureIII>
<PatSignatureIV dsi="user 2009/06/02 10:43"></PatSignatureIV>
<PatSignature dsi="user 2009/06/02 10:43">313031320D0A3</PatSignature>
<Relationship dsi="user 2009/06/02 10:43">Mother</Relationship>
<currentTime3 dsi="user 2009/06/02 10:43">10:36</currentTime3>
</consent_to_treat>

それは私が扱わなければならないXMLを模倣していますが、実際には、いくつかの要素には複数行のテキストが含まれているため、この冒険ははるかに興味深いものになります...

重複がない限り機能する正規表現を作成しました。

$text =~ s/(<(\w+) +[" \w\/\-=:]+?>)(?!\n)(.+?)(?<!\n)(<\/\2>)/$1<!\[CDATA\[$3\]\]>$4/gs;

ただし、この例では、次のように失敗します。

<consent_to_treat dsi="user 2009/06/02 10:43" version="">
<currentTime4 dsi="user 2009/06/02 10:43"><![CDATA[10:36]]></currentTime4>
<todayDate dsi="user 2009/06/02 10:43"><![CDATA[06/02/2009]]></todayDate>
<todayDate3 dsi="user 2009/06/02 10:43"><![CDATA[06/02/2009]]></todayDate3>
<todayDate4 dsi="user 2009/06/02 10:43"><![CDATA[06/02/2009]]></todayDate4>
<currentTime dsi="user 2009/06/02 10:43"><![CDATA[10:36]]></currentTime>
<Relationship dsi="user 2009/06/02 10:43"><![CDATA[</Relationship>
<PatSignatureIII dsi="user 2009/06/02 10:43"></PatSignatureIII>
<PatSignatureIV dsi="user 2009/06/02 10:43"></PatSignatureIV>
<PatSignature dsi="user 2009/06/02 10:43">313031320D0A3</PatSignature>
<Relationship dsi="user 2009/06/02 10:43">Mother]]></Relationship>
<currentTime3 dsi="user 2009/06/02 10:43"><![CDATA[10:36]]></currentTime3>
</consent_to_treat>

それを欲張りでないものにするための最良の方法、またはおそらく、私のものとは異なるより良い解決策は何ですか?

前もって感謝します。

PS私は最終的にそれを理解したと思います。次のコードでうまくいくようです。

$text =~ s/(<(\w+) +[" \w\/\-=:]+?>)(?!(\n|\s*<\/\2>))(.+?)(?<!\n)(<\/\2>)/$1<!\[CDATA\[$4\]\]>$5/gs;

私の質問に答えてくれたすべての人にもう一度感謝します、そして私はまだより良い解決策を開いています...

4

1 に答える 1

0

この正規表現は、必要なことを実行します。

s/(<[^>]+>)(.*?)(<\/[^>]+>)/$1<![CDATA[$2]]>$3/gi

コード:

#!/usr/bin/perl

my $xml = <<'END_XML';
<currentTime4 dsi="user 2009/06/02 10:43">10:36</currentTime4>
<todayDate dsi="user 2009/06/02 10:43">06/02/2009</todayDate>
<todayDate3 dsi="user 2009/06/02 10:43">06/02/2009</todayDate3>
<todayDate4 dsi="user 2009/06/02 10:43">06/02/2009</todayDate4>
<currentTime dsi="user 2009/06/02 10:43">10:36</currentTime>
<Relationship dsi="user 2009/06/02 10:43"></Relationship>
<PatSignatureIII dsi="user 2009/06/02 10:43"></PatSignatureIII>
<PatSignatureIV dsi="user 2009/06/02 10:43"></PatSignatureIV>
<PatSignature dsi="user 2009/06/02 10:43">313031320D0A3</PatSignature>
<Relationship dsi="user 2009/06/02 10:43">Mother</Relationship>
<currentTime3 dsi="user 2009/06/02 10:43">10:36</currentTime3>
</consent_to_treat>
END_XML

$xml =~ s/(<[^>]+>)(.*?)(<\/[^>]+>)/$1<![CDATA[$2]]>$3/gi;

print $xml;

出力:

<currentTime4 dsi="user 2009/06/02 10:43"><![CDATA[10:36]]></currentTime4>
<todayDate dsi="user 2009/06/02 10:43"><![CDATA[06/02/2009]]></todayDate>
<todayDate3 dsi="user 2009/06/02 10:43"><![CDATA[06/02/2009]]></todayDate3>
<todayDate4 dsi="user 2009/06/02 10:43"><![CDATA[06/02/2009]]></todayDate4>
<currentTime dsi="user 2009/06/02 10:43"><![CDATA[10:36]]></currentTime>
<Relationship dsi="user 2009/06/02 10:43"><![CDATA[]]></Relationship>
<PatSignatureIII dsi="user 2009/06/02 10:43"><![CDATA[]]></PatSignatureIII>
<PatSignatureIV dsi="user 2009/06/02 10:43"><![CDATA[]]></PatSignatureIV>
<PatSignature dsi="user 2009/06/02 10:43"><![CDATA[313031320D0A3]]></PatSignature>
<Relationship dsi="user 2009/06/02 10:43"><![CDATA[Mother]]></Relationship>
<currentTime3 dsi="user 2009/06/02 10:43"><![CDATA[10:36]]></currentTime3>
</consent_to_treat>
于 2011-12-29T01:00:32.243 に答える