状況
XML を編集して値を正常に変更したら、変更内容をファイルに書き戻す必要があります。ただし、これを行うと、(a) date_time と (b) xmlns:xsi の 2 つの属性を持つ XML の最初のタグが、uodate の後で入れ替わります。
以下は、XML のサンプルです。
XML ドキュメントのサンプル
オリジナルの XML
<?xml version="1.0" encoding="UTF-8"?>
<basenet date_time="201202131140" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<msg_ver>01</msg_ver>
<sender_id>1234</sender_id>
<recipient_id>Bob</recipient_id>
</basenet>
出力
<?xml version="1.0" encoding="UTF-8"?>
<tradenet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" date_time="201202131140">
<msg_ver>01</msg_ver>
<sender_id>1234</sender_id>
<recipient_id>Bob</recipient_id>
</tradenet>
コード
sub CHANGE_DATE_SEQ_NUM()
{
# load
open my $fh, '<', $newfile;
binmode $fh; # drop all PerlIO layers possibly created by a use open pragma
my $doc = XML::LibXML->load_xml(IO => $fh);
my $query = "/tradenet/message/header/unique_ref_no/date/text( )";
my $query2 = "/tradenet/message/header/unique_ref_no/seq_no/text( )";
my $query3 = "/tradenet/message/transport/out_tpt/dept_date/text( )";
#print $query3;
my($node) = $doc->findnodes($query);
my($node2) = $doc->findnodes($query2);
my($node3) = $doc->findnodes($query3);
$node->setData("$date");
$node2->setData("$file_seq_number");
$node3->setData("$date");
# save
open my $out, '>', $newfile;
binmode $out; # as above
$doc->toFH($out);
}
私の質問 タグの date_time と xmlns:xsi が入れ替わるのはなぜですか? この切り替えにより、サーバー側で XML の検証が失敗します。
ありがとうございました。