1

XMLパーサーを使用してテキストファイルの値を読み取り、xmlファイルに置き換えるPerlスクリプト

xml タグを読み取り、テキスト ファイルの値から値を置き換える方法。エントリ値が install.properties で null の場合、property.xml で同じ値を更新する必要があり、エントリ値が null xml の場合、テキスト ファイルの値で更新する必要があります。

install.properties テキスト ファイル

TYPE = Patch
LOCATION = 
HOST = 127.1.1.1
PORT = 8080

値が置換される前の property.xml ファイル

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <entry key="TYPE">Release</entry>
    <!-- tst  -->
    <entry key="LOCATION">c:/release</entry>
    <entry key="HOST">localhost</entry>    
    <entry key="PORT"></entry>    

</properties>

値が置き換えられた後の property.xml ファイル

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <entry key="TYPE">Patch</entry>
    <!-- tst  -->
    <entry key="LOCATION"></entry>
    <entry key="HOST">127.1.1.1</entry>    
    <entry key="PORT">8080</entry>    

</properties>
4

2 に答える 2

6

XML::LibXMLのラッパーであるXML ::XSH2を使用したソリューション。

#!/usr/bin/perl
use warnings;
use strict;

use XML::XSH2;

open my $INS, '<', 'install.properties' or die $!;

while (<$INS>) {
    chomp;
    my ($var, $val) = split / = /;        # / fix StackOverflow syntax highlighting.
    $XML::XSH2::Map::ins->{$var} = $val;
}

xsh << '__XSH__';
open property.xml ;
for /properties/entry {
    set ./text() xsh:lookup('ins', @key) ;
}
save :b ;
__XSH__

のみを使用して実装された同じプログラムXML::LibXML:

#!/usr/bin/perl
use warnings;
use strict;

use XML::LibXML;

open my $INS, '<', 'install.properties' or die $!;

my %ins;
while (<$INS>) {
    chomp;
    my ($var, $val) = split / = /;  # / fix StackOverflow syntax highlighting.
    $ins{$var} = $val;
}

my $xml = 'XML::LibXML'->load_xml( location => 'property.xml' );
for my $entry( $xml->findnodes('/properties/entry')) {
    my ($text) = $entry->findnodes('text()');
    $text->setData($ins{ $entry->getAttribute('key') });
}
rename 'property.xml', 'property.xml~';
$xml->toFile('property.xml');
于 2013-08-14T10:23:00.593 に答える