Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用xml::DOM按子节点的值对xml节点排序的最佳方法_Xml_Perl_Dom_Xmldom - Fatal编程技术网

使用xml::DOM按子节点的值对xml节点排序的最佳方法

使用xml::DOM按子节点的值对xml节点排序的最佳方法,xml,perl,dom,xmldom,Xml,Perl,Dom,Xmldom,我试图对xml文件中的一组节点进行排序,结果比我想象的要困难得多。我使用的是XML::DOM,我想获取一个节点,并根据一个值对一组子节点进行排序,在本例中,根据member/num值对成员节点进行排序 以下是一个xml文件: <?xml version="1.0"?> <family> <member><num>1A</num><name>isashi</name></member> <memb

我试图对xml文件中的一组节点进行排序,结果比我想象的要困难得多。我使用的是XML::DOM,我想获取一个节点,并根据一个值对一组子节点进行排序,在本例中,根据member/num值对成员节点进行排序

以下是一个xml文件:

<?xml version="1.0"?>
<family>
<member><num>1A</num><name>isashi</name></member>
<member><num>1</num><name>felix</name></member>
<member><num>3</num><name>brandon</name></member>
<member><num>5</num><name>jeremy</name></member>
<member><num>4B</num><name>aaron</name></member>
</family>
此代码会导致如下错误:

Can't call method "getNodeName" on an undefined value at sort-nodes-test.pl line 47.
我尝试了一些其他的事情,比如在foreach循环之外定义节点,但是这忽略了输出中的一些元素,即使所有控制台输出都是正确的

当我交换这一行时:

$parentNode->replaceChild($nodeMem, $oldNode);
对于此($root在foreach外部定义):

我确实得到了正确的输出,但这似乎很奇怪。我可能在写这篇文章时回答了我自己的问题(我想这不是一件坏事……),但这个解决方案会一直有效吗?第二种解决方案是否正确,以及为什么有效?我认为它会添加排序节点的副本


另外,任何喜欢的包,用perl排序xml节点的方法?

毫不奇怪,我会使用xml::Twig:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $t= XML::Twig->new( pretty_print => 'record_c')->parsefile( $ARGV[0]);
$t->root->sort_children_on_field( 'num');
$t->print;

在任何情况下,我都会尽量避免使用XML::DOM。XML::LibXML非常相似,但速度更快,具有更多功能,并且维护更好。

毫不奇怪,我会使用XML::Twig:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $t= XML::Twig->new( pretty_print => 'record_c')->parsefile( $ARGV[0]);
$t->root->sort_children_on_field( 'num');
$t->print;

在任何情况下,我都会尽量避免使用XML::DOM。LibXML非常类似,但速度更快,具有更多的功能,维护也更好。

XSLT可以排序。您需要使用XML::LibXSLT.XSLT进行排序。您需要使用XML::LibXSLT。
#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $t= XML::Twig->new( pretty_print => 'record_c')->parsefile( $ARGV[0]);
$t->root->sort_children_on_field( 'num');
$t->print;