我是Perl XML的新手:DOM XML:XPath(必须只使用这些。) 如何将值插入以下xml文件: 需要在10月20日之前在BadgeID中插入1010,1011(仅使用Perl DOM和XPath) 尝试以下方法:
#!/usr/bin/perl
use XML::DOM;
use XML::XPath;
my $mainFile = "badgelist.xml";
$xpmain = eval { XML::XPath->new( filename => $mainFile ); };
my $root = $main->getDocumentElement();
my @list = $root->getElementsByTagName('Name');
foreach my $key ( @list ) {
if( $key->getFirstChild->getData eq 'Home' ) {
$root->insertBefore($newparam, $genericMap);
# Insert 1005, 1006 and 1007 before 1008
}
}
<Badge-Lists>
<List>
<Name>Home</Name>
<Badges>
<BadgeID>1001</BadgeID>
<BadgeID>1008</BadgeID>
<BadgeID>1020</BadgeID>
</Badges>
</List>
<List>
<Name>Office</Name>
<Badges>
<BadgeID>5001</BadgeID>
<BadgeID>5012</BadgeID>
<BadgeID>5040</BadgeID>
</Badges>
</List>
</Badge-Lists>
答案 0 :(得分:0)
这会奏效。我只是通过阅读XML :: DOM的文档来实现这一目的。
use strict;
use warnings;
use XML::DOM;
my $parser = XML::DOM::Parser->new;
my $doc = $parser->parse(*DATA);
# the documentation of XML::DOM is extensive, but I'm not familiar with it,
# so we just use good old Perl to find the right element
my ($badge_1020) = grep { $_->getFirstChild->getNodeValue eq '1020' ? $_ : () }
$doc->getElementsByTagName('BadgeID');
# we need the parent to insert new nodes later
my $badges = $badge_1020->getParentNode;
foreach my $value ( 1010, 1011 ) {
# create a new element based on our badge
my $node = $badge_1020->cloneNode(1);
# change the text
$node->getFirstChild->setNodeValue($value);
# put it into the Badges before the 1020 one
$badges->insertBefore( $node, $badge_1020 );
}
print $doc->toString;
__DATA__
<Badge-Lists>
<List>
<Name>Home</Name>
<Badges>
<BadgeID>1001</BadgeID>
<BadgeID>1008</BadgeID>
<BadgeID>1020</BadgeID>
</Badges>
</List>
<List>
<Name>Office</Name>
<Badges>
<BadgeID>5001</BadgeID>
<BadgeID>5012</BadgeID>
<BadgeID>5040</BadgeID>
</Badges>
</List>
</Badge-Lists>
将输出:
<Badge-Lists>
<List>
<Name>Home</Name>
<Badges>
<BadgeID>1001</BadgeID>
<BadgeID>1008</BadgeID>
<BadgeID>1010</BadgeID><BadgeID>1011</BadgeID><BadgeID>1020</BadgeID>
</Badges>
</List>
<List>
<Name>Office</Name>
<Badges>
<BadgeID>5001</BadgeID>
<BadgeID>5012</BadgeID>
<BadgeID>5040</BadgeID>
</Badges>
</List>
</Badge-Lists>