2016-09-27 13 views
0

Perl XMLの新機能:DOM XML:XPath(これらのみを使用する必要があります) 次のxmlファイルに値を挿入する方法:1010,1011を挿入する必要があります1020年前(のみPerlのDOM & XPathを使用)BadgeIDに は、次のことをしようとしました: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モジュール名は、2つのコロン '::'、ないものを持っています。あなたはこれに取り組んだり、立ち往生したり、始める方法がわからないのですか? – 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> 
関連する問題