변환펄 XML 내가 Perl과 CPAN 모듈을위한 초보자 해요 솔루션
나는 XML 파일을 변환 싶어은 다음과 같습니다
<Item><Link>http://example.com/</Link></Item>....
<Item><Link>http://mysite.com/</Link></Item>....
에 스마트 솔루션이 있습니까?
CPAN 모듈로
변환펄 XML 내가 Perl과 CPAN 모듈을위한 초보자 해요 솔루션
나는 XML 파일을 변환 싶어은 다음과 같습니다
<Item><Link>http://example.com/</Link></Item>....
<Item><Link>http://mysite.com/</Link></Item>....
에 스마트 솔루션이 있습니까?
CPAN 모듈로
을 유지하기
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>
당신이 필요로하는 모든 특정 값을 변경하는 경우, 당신은 정말로 특별한 것을 필요로하지 않습니다, 당신은 단순히 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")
간단한 해결책은 : 나뭇 가지 아래입니다. XML :: Simple 옵션과 비교하여 Link
요소가 XML에 상관없이 작동하며 파일의 원래 형식을 준수합니다. XML이 혼합 컨텐츠를 포함하는 경우에도 작동합니다. 이 곳에서 파일을 변경해야하는 경우
대신 parsefile
의 parsefile_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
}
+1 정규 표현식 솔루션을 지정하기 위해 XML을 잘 알고있는 불신자가 당신을 무자비하게 처벌 할 것입니다! 열린 마음을 가진 유용한 시스템 관리자가된다는 요지는 간단한 솔루션을 사용해야하는시기와 무거운 무게를 사용할시기를 아는 것입니다. 따라서 XML 팬은 간혹 간단한 솔루션만으로도 충분하다는 생각은 거의 없습니다. –
고마워요. 정확히 XML에 대한 느낌입니다. 가끔 이런 식으로 수정하기 위해 전체 XML 라이브러리가 필요하지 않은 경우도 있습니다. – OneOfOne
사실 우리는 나머지 XML에 대한 정보가 많지 않습니다. URL이 포함 된 다른 요소가 포함될 수도 있습니다. 또는 미래에 그들을 포함 할 수도 있습니다. 그래서 나는 어떤 경우 에든 올바른 해결책을 제시하고자합니다. – mirod