2016-09-27 3 views
0

Я новичок в Perl XML: DOM XML: XPath (необходимо использовать только эти.) Как вставить значения в следующий файл xml: Нужно вставить 1010, 1011 Перед 1020 в BadgeID (Использование только Perl DOM & XPath) Пробовал следующее:Perl XML DOM XPATH: Вставка значений с использованием Perl

#!/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

Perl имена модулей имеют два двоеточия '::', а не один. Вы начали работать над этим и застряли, или вы не знаете, с чего начать? – simbabque

+1

Что вы пробовали? Какие у вас проблемы? Пожалуйста, покажите нам какой-нибудь код. Почему, по-вашему, вы должны использовать эти конкретные модули? –

+0

Ваш XML недопустим. У него нет закрывающего тега. – simbabque

ответ

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> 
Смежные вопросы