PERL XML :: LibXML在输出XML时更改标记结构

时间:2012-05-02 21:01:03

标签: xml perl

情况

编辑完XML并成功更改值后,我需要将更改写回文件。但是,当我这样做时,XML的第一个标签有两个属性(a)date_time和(b)xmlns:xsi在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在我的服务器端验证失败。

谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

属性顺序在XML中没有意义,因此错误在您的验证代码中。

对于XML :: LibXML或底层libxml2来说,维护订单的效率可能会低一些,所以他们没有这样做,因为没有理由这样做。这些属性可能存储在哈希表中。

相关问题