Perl XML DOM XPATH:使用Perl插入值

时间:2016-09-27 10:32:33

标签: xml perl dom

我是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>

1 个答案:

答案 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>