按节点名称对XML元素的子项进行排序

时间:2014-04-14 12:50:56

标签: xml perl sorting libxml2

嗨,我是perl和xml的新手,试图通过节点对这个XML文件进行排序。我在这里使用LibXML是一个xml文件的例子

<root>
        <st_5>val5</st_5>
        <st_1>val1</st_1>
        <st_6>val6</st_6>
        <st_8>val8</st_8>
        <st_4>val4</st_4>
        <st_0>val0</st_0>
</root>

这是我到目前为止的代码。这里的一些代码我得到了它在stackoverflow上发布的一些问题

#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
my @newnodes = qw();
my $parser = XML::LibXML->new();
my $xmldoc = $parser->parse_file('test2_new.xml');
my($book)  = $xmldoc->findnodes ('/root/.');
$book->appendTextChild('st_2', 'stss');
 $xmldoc->toFile ("test2_new.xml",2);
for my $node ($xmldoc->findnodes('/root/*[text()]'))
 {
  my @nodes =  $node->nodeName();
  push (@newnodes,@nodes);
 }
my @x = sort { substr($a, 3) <=> substr($b, 3)  } @newnodes;
print "soted list \n @x \n","\n";
sub bubble 
{   
unshift @{$_[0]}, $_[1];
for my $i( 0..@{$_[0]}-2 )
 {
  last if $_[0]->[$i] le $_[0]->[$i+1];
  ( $_[0]->[$i],$_[0]->[$i+1] ) = ( $_[0]->[$i+1],$_[0]->[$i] )
 }
}

我的目标是对列表进行排序,在xml文件中添加一个新节点,然后在父列表的末尾插入新节点,以对xml文件中的所有节点进行排序。这样,每添加一个新节点后,它就会对节点进行排序。我能够在打印时对列表进行排序,但不能在xml文件中对列表进行排序。

请帮忙

2 个答案:

答案 0 :(得分:1)

使用XML::XSH2XML::LibXML的包装:

open file.xml ;
xmove &{ sort :k name() /root/* } into /root ;
save :b ;

答案 1 :(得分:1)

创建一个新文档并将已排序的节点添加到其中:

use strict;
use warnings;

use XML::LibXML;

my $xmldoc = XML::LibXML->load_xml(string => do {local $/; <DATA>});

my $newdoc = XML::LibXML::Document->new;
my $root = $newdoc->createElement('root');
$newdoc->setDocumentElement($root);

my @nodelist = sort {$a->nodeName cmp $b->nodeName} $xmldoc->findnodes('/root/*');

foreach my $node (@nodelist) {
        my $newnode = $newdoc->importNode($node);
        $newdoc->documentElement->addChild($newnode);
}

#print $xmldoc->toString();
print $newdoc->toString(1);

__DATA__
<root>
        <st_5>val5</st_5>
        <st_1>val1</st_1>
        <st_6>val6</st_6>
        <st_8>val8</st_8>
        <st_4>val4</st_4>
        <st_0>val0</st_0>
</root>

输出:

<?xml version="1.0"?>
<root>
  <st_0>val0</st_0>
  <st_1>val1</st_1>
  <st_4>val4</st_4>
  <st_5>val5</st_5>
  <st_6>val6</st_6>
  <st_8>val8</st_8>
</root>