2016-12-02 2 views
1

Wie man einen Knotenwert von XML erhalten, basierend auf einem anderen Knoten Wert perl mit

Ich habe meine projects.xml Datei wie folgt:

<projects> 
    <project> 
     <id>ID_ABCD1</id> 
     <name>ptest1</name> 
    </project> 
    <project> 
     <id>IDB_abcd</id> 
     <name>ptest1</name> 
     <branch>bnm1</branch> 
     <branched_from_id>ID_ABCD1</branched_from_id> 
     <branched_from_version>111</branched_from_version> 
    </project> 
    <project> 
     <id>ID_ABCD2</id> 
     <name>ptest2</name> 
    </project> 
    <project> 
     <id>IDB_abcd2</id> 
     <name>ptest2</name> 
     <branch>bnm2</branch> 
     <branched_from_id>ID_ABCD2</branched_from_id> 
     <branched_from_version>111</branched_from_version> 
    </project> 
</projects> 

In meinem vorhandenen Code, den ich Namen bin immer Projekt auf Projekt-ID aus einer anderen Datei categories.xml erhalten.

Für jede dieser Projektnamen ich suchen muß, ist es ein branch Element für sie, und wenn das Element Ich habe existiert dann die entsprechenden branch Namen und branched_from_version zu bekommen.

branched_from_id Wert ist die ID eines anderen Projekts.

#!/usr/bin/env perl 

use strict; 

use XML::LibXML; 
use File::Basename; 
use File::Find::Rule; 
use XML::Twig; 

my $cat_xml = '/home/Ras/categories.xml'; 
my $twig  = XML::Twig->parse($cat_xml); 
my $doc  = XML::LibXML->new->parse_file($cat_xml); 

my $proj_xml = '/home/Ras/projects.xml'; 
my $twigp = XML::LibXML->new->parse_file($proj_xml); 

my @nodes = $doc->findnodes('/categories/category'); 

my $catname = "/home/Ras/category.txt"; 

open FH, "> $catname" or warn "not able to open catname file"; 

foreach my $catnode (@nodes) { 
    my @catn = $catnode->findvalue('@name'); 
    print FH "@catn \n"; 
} 

my @catlist = `cat /home/Ras/category.txt`; 

foreach my $cat (@catlist) { 

    chomp($cat); 
    $cat =~ s/^\s+|\s$//g; 

    my $path = "./category[\@name=\"$cat\"]/project"; 

    foreach my $project ($twig->findnodes("$path")) { 

     my $projout = $project->text; 

     foreach my $projname ($twigp->findvalue("/projects/project[id = '$projout']/name")) { 

     } 
    } 
} 

In obigem Code $projout enthalten den ID-Wert meiner project.xml Datei. Aber diese ID-Wert mit branch Knoten sind nicht da.

Ich habe Name Wert in $projname. Also, basierend auf dem Namen Wert in $projname muss ich den entsprechenden branch Wert und branched_from_version Wert erhalten.

+1

Warum mischen Sie 'XML :: Twig' und' XML :: LibXML'? Das sieht nach einem Weg zum Schmerz aus. – Sobrique

+0

Können Sie klären, was die erwarteten Ein- und Ausgänge sind? Vielleicht können wir mit der gewünschten Leistung laufen? – Sobrique

+0

Das ist ein bisschen Chaos. Sie erstellen eine Liste von 'category' Namen aus' categories.xml' und schreiben sie auf den Datenträger; dann liest du es zurück und suchst die gleiche xml-datei nach diesen 'category'-elementen! Sie müssen auch 'categories.xml' anzeigen, wenn Sie Hilfe benötigen. – Borodin

Antwort

1

Es ist ein bisschen vereinfacht, aber ich glaube, Sie versuchen, etwas zu tun:

#!/usr/bin/env perl 
use warnings; 
use strict; 

use XML::Twig; 

my $twig = XML::Twig -> parsefile ('test.xml'); 
my $project = 'ptest2'; 

if ($twig -> get_xpath("//project/name[string()=\"$project\"]")) { 
    print $twig -> get_xpath("//project/name[string()=\"$project\"]",0) -> text, " exists\n"; 
    foreach my $branch ($twig -> get_xpath("//project/name[string()=\"$project\"]/../branched_from_id/..",0)) { 
     print "$project : ", $branch -> first_child_text('branched_from_id'), " => ", $branch -> first_child_text('branched_from_version'),"\n"; 
    } 
} 

Ich habe es zu senken, weil ich nicht Ihre Projekte-Liste haben. Aber das wird XML::Twig s get_xpath verwenden, um einen Projektnamen zu finden - obwohl es nicht unterscheidet, ob es eine Verzweigung für den ersten Teil der Prüfung ist oder nicht.

Und dann zieht eine xpath Übereinstimmung basierend auf dieser aller Zweige, die "übereinstimmen".

Verwandte Themen