2011-01-06 4 views

답변

3
  • XML::Twig를 참조 - 트리 모드에서 큰 XML 문서를 처리하기위한 펄 모듈을.
  • 또는 XML::Simple - 간편한 API는, XML (특히 설정 파일)과 같은

을 유지하기

use strict; 
use warnings; 
use XML::Simple; 
use Data::Dumper; 

my $xml = q~<?xml version='1.0'?> 
<root> 
    <Item> 
    <Link>http://example.com/</Link> 
    </Item> 
    <Item> 
    <Link>http://example1.com/</Link> 
    </Item> 
</root>~; 

print $xml,$/; 

my $data = XMLin($xml); 

print Dumper($data); 

foreach my $test (@{$data->{Item}}){ 
    foreach my $key (keys %{$test}){ 
     $test->{$key} =~ s/example/mysite/; 
    } 
} 
print XMLout($data, RootName=>'root', NoAttr=>1,XMLDecl => 1); 

출력 :

<?xml version='1.0'?> 
<root> 
    <Item> 
    <Link>http://example.com/</Link> 
    </Item> 
    <Item> 
    <Link>http://example1.com/</Link> 
    </Item> 
</root> 
$VAR1 = { 
      'Item' => [ 
        { 
         'Link' => 'http://example.com/' 
        }, 
        { 
         'Link' => 'http://example1.com/' 
        } 
        ] 
     }; 
<?xml version='1.0' standalone='yes'?> 
<root> 
    <Item> 
    <Link>http://mysite.com/</Link> 
    </Item> 
    <Item> 
    <Link>http://mysite1.com/</Link> 
    </Item> 
</root> 
0

당신이 필요로하는 모든 특정 값을 변경하는 경우, 당신은 정말로 특별한 것을 필요로하지 않습니다, 당신은 단순히 regexp를 사용할 수 있습니다 :
명령 줄에서 :

perl -pi -e '[email protected]://example.com/@http://mysite.com/@g' file.xml 

편집 : 추가 전체 코드 버전 : XML을 사용하여

my $file = '/tmp/test.xml'; 

open IN, "<$file" or die "can't open $file $!"; 
open OUT, ">$file.tmp" or die "can't open $file.tmp $!"; 
foreach (<IN>) { 
    [email protected]://example.com/@http://mysite.com/@g; 
    print OUT $_; 
} 
close(IN); 
close(OUT); 

rename("$file.tmp", "$file") 
+0

+1 정규 표현식 솔루션을 지정하기 위해 XML을 잘 알고있는 불신자가 당신을 무자비하게 처벌 할 것입니다! 열린 마음을 가진 유용한 시스템 관리자가된다는 요지는 간단한 솔루션을 사용해야하는시기와 무거운 무게를 사용할시기를 아는 것입니다. 따라서 XML 팬은 간혹 간단한 솔루션만으로도 충분하다는 생각은 거의 없습니다. –

+0

고마워요. 정확히 XML에 대한 느낌입니다. 가끔 이런 식으로 수정하기 위해 전체 XML 라이브러리가 필요하지 않은 경우도 있습니다. – OneOfOne

+1

사실 우리는 나머지 XML에 대한 정보가 많지 않습니다. URL이 포함 된 다른 요소가 포함될 수도 있습니다. 또는 미래에 그들을 포함 할 수도 있습니다. 그래서 나는 어떤 경우 에든 올바른 해결책을 제시하고자합니다. – mirod

3

간단한 해결책은 : 나뭇 가지 아래입니다. XML :: Simple 옵션과 비교하여 Link 요소가 XML에 상관없이 작동하며 파일의 원래 형식을 준수합니다. XML이 혼합 컨텐츠를 포함하는 경우에도 작동합니다. 이 곳에서 파일을 변경해야하는 경우

대신 parsefileparsefile_inplace을 사용할 수 있습니다, 나는 subs_text에서 정규 표현식이 실제 생활에서 개선해야 할 수 있습니다 생각하지만,이 코드는 좋은 출발점이되어야한다.

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

XML::Twig->new(twig_roots => { Link => \&replace_link, }, # process Link 
       twig_print_outside_roots => 1,    # output everything else 
      ) 
      ->parsefile('my.xml'); 

sub replace_link 
    { my($t, $link)= @_; 
    $link->subs_text(qr{^http://example\.com/$}, 'http://mysite.com'); 
    $t->flush;    # or $link->print, outputs the modified (or not) link 
    }   
관련 문제