嗨,我是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文件中对列表进行排序。
请帮忙
答案 0 :(得分:1)
使用XML::XSH2,XML::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>