2016-01-05 108 views
-1

我有一個Perl腳本,我想修改它來刪除兩個XML標籤之間的空格。如何刪除兩個XML標籤之間的所有空格?

示例XML:

<TAG> 
<TAG1><TAG2>abc 123 def 456 ... </TAG2></TAG1><TAG1><TAG2>xyz 987 ... </TAG> 

我想刪除所有TAG2標籤之間的空格所有出現。我嘗試了以下內容:

$vModStrg =~ s/(<TAG2>(.*?)<\/TAG2>)/<TAG2>zzzzzz<\/TAG2>/g; 

但是這會將整個比賽替換爲zzzzz。我如何告訴Perl只刪除匹配中的所有空格TAG2

+9

不要使用正則表達式解析XML。使用解析器。這使得你的問題很荒唐。 XML :: Twig很好。 – Sobrique

回答

2

正則表達式對於這項工作來說是一個糟糕的工具,因爲解析XML需要遞歸。你可以用更新版本的正則表達式來做到這一點,但最多會導致非常複雜和難以閱讀的正則表達式,並有邊緣情況下他們會破壞。

參見:Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms

所以使用解析器 - 爲 '<TAG2>元件之間的空間' 刪除:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use XML::Twig; 

#parse the data from our "DATA" filehandle. 
#you might want "parsefile('somefilename.xml')" instead. 
my $twig = XML::Twig -> parse (\*DATA); 

#iterate 'text' below "TAG2" anywhere in the document. 
foreach my $tag ($twig -> get_xpath ('//TAG2/#TEXT')) { 
    #modify this tag. 
    $tag -> set_text($tag -> text =~ s/\s+//gr); 
} 
#set output options 
$twig -> set_pretty_print('indented_a'); 
#print to STDOUT. You might want: 
#print {$output_fh} $twig -> sprint; 
$twig -> print; 

__DATA__ 
<root> 
    <TAG2>words with spaces</TAG2> 
    <TAG2> 
     <child>wordswordswords more words 
     </child> 
    </TAG2> 
    <TAG1>some more words with spaces</TAG1> 
    <TAG2>something here 
     <another_child att="fish" /> 
    </TAG2> 
</root> 

此輸出:

<root> 
    <TAG2>wordswithspaces</TAG2> 
    <TAG2> 
    <child>wordswordswords more words 
     </child> 
    </TAG2> 
    <TAG1>some more words with spaces</TAG1> 
    <TAG2>somethinghere<another_child att="fish" /></TAG2> 
</root> 

因此,大家可以看到 - 正確修改<TAG2>元素之間的文字,並保持其他東西不變。而對於獎勵積分,它至少很清楚它在做什麼,就像一個等效的正則表達式一樣!

相關問題