2017-10-10 8 views
0

J'essaye d'analyser les statistiques de performance (3gpp 32.435). La structure n'est pas aussi simple que je le souhaite, voir l'exemple. Le résultat que je cherche est d'avoir une sortie de texte avecAnalyseur Perl XML pour DOM

endTime:measType:measValue 

J'ai essayé d'utiliser un script Perl pour extraire des valeurs, mais comme vous pouvez le voir, pour SGSN-MME_Session_SM_G il y a deux types et deux valeurs, de sorte que le résultat pour mon script est

 SM.SuccActSecondPdpContext.G 
    SM.UnsuccActPdpContextCC38.G 

     1 
     473764 

Si quelqu'un pouvait me donner une idée comment analyser ce XML ou comment rejoindre le type et la valeur de deux enfants d'un parent. Je serais reconnaissant, merci ..

Script utilisé:

#!/usr/bin/perl 

use 5.010; 
use strict; 
use warnings; 

use XML::LibXML; 

my $filename = 'file.xml'; 

my $dom = XML::LibXML->load_xml(location => $filename); 

foreach my $measvalue ($dom->documentElement) { 
     say $measvalue->to_literal(); 
    } 

fichier XML:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="MeasDataCollection.xsl"?> 
<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec"> 
    <fileHeader fileFormatVersion="32.435 V9.0" vendorName="New Vendor"> 
     <fileSender /> 
     <measCollec beginTime="2017-10-09T20:17:00+03:00" /> 
    </fileHeader> 
    <measData> 
     <managedElement localDn="TestNode" /> 
     <measInfo measInfoId="SGSN-MME_Mobility_U"> 
     <job jobId="customPdcJob" /> 
     <granPeriod duration="PT60S" endTime="2017-10-09T20:18:00+03:00" /> 
     <repPeriod duration="PT60S" /> 
     <measType p="1">succGprsAttachUmts</measType> 
     <measValue measObjLdn="ManagedElement=TestNode,SgsnFunction=1"> 
      <r p="1">132737759</r> 
     </measValue> 
     </measInfo> 
     <measInfo measInfoId="SGSN-MME_Session_DiscardedMessages_G"> 
     <job jobId="customPdcJob" /> 
     <granPeriod duration="PT60S" endTime="2017-10-09T20:18:00+03:00" /> 
     <repPeriod duration="PT60S" /> 
     <measType p="1">discardedSessionMgmnt</measType> 
     <measValue measObjLdn="ManagedElement=TestNode,SgsnFunction=1"> 
      <r p="1">12368</r> 
     </measValue> 
     </measInfo> 
     <measInfo measInfoId="SGSN-MME_Session_SM_G"> 
     <job jobId="customPdcJob" /> 
     <granPeriod duration="PT60S" endTime="2017-10-09T20:18:00+03:00" /> 
     <repPeriod duration="PT60S" /> 
     <measType p="1">SM.SuccActSecondPdpContext.G</measType> 
     <measType p="2">SM.UnsuccActPdpContextCC38.G</measType> 
     <measValue measObjLdn="ManagedElement=TestNode,SgsnFunction=1"> 
      <r p="1">1</r> 
      <r p="2">473764</r> 
     </measValue> 
     </measInfo> 
     <measInfo measInfoId="SGSN-MME_Session_SM_U"> 
     <job jobId="customPdcJob" /> 
     <granPeriod duration="PT60S" endTime="2017-10-09T20:18:00+03:00" /> 
     <repPeriod duration="PT60S" /> 
     <measType p="1">SM.UnsuccActPdpContextCC38.U</measType> 
     <measValue measObjLdn="ManagedElement=TestNode,SgsnFunction=1"> 
      <r p="1">737355</r> 
     </measValue> 
     </measInfo> 
     <measInfo measInfoId="SGSN-MME_SystemResource_PIU"> 
     <job jobId="customPdcJob" /> 
     <granPeriod duration="PT60S" endTime="2017-10-09T20:18:00+03:00" /> 
     <repPeriod duration="PT60S" /> 
     <measType p="1">SYS.gsnApCpuUsage</measType> 
     <measValue measObjLdn="ManagedElement=TestNode,SgsnMme=1,PIU=1.1"> 
      <r p="1">6</r> 
     </measValue> 
     <measValue measObjLdn="ManagedElement=TestNode,SgsnMme=1,PIU=1.3"> 
      <r p="1">5</r> 
     </measValue> 
     <measValue measObjLdn="ManagedElement=TestNode,SgsnMme=1,PIU=1.5"> 
      <r p="1">5</r> 
     </measValue> 
     <measValue measObjLdn="ManagedElement=TestNode,SgsnMme=1,PIU=1.7"> 
      <r p="1">5</r> 
     </measValue> 
     </measInfo> 
    </measData> 
    <fileFooter> 
     <measCollec endTime="2017-10-09T20:18:00+03:00" /> 
    </fileFooter> 
</measCollecFile> 
+0

On dirait que cette question a un vote serré parce que vous avez commencé avec " Je suis à la recherche d'un script de parseur XML, "qui se lit comme si vous aviez une exigence" Donnez-moi le codez ". Poser vos questions comme des questions directes aiderait à éviter cela;) –

Répondre

1
use strict; 
use warnings qw(all); 
use feature qw(say); 

use XML::LibXML    qw(); 
use XML::LibXML::XPathContext qw(); 

my $doc = XML::LibXML->load_xml(location => $filename); 

my $xpc = XML::LibXML::XPathContext->new(); 
$xpc->registerNs(m => 'http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec'); 

for my $measInfoNode ($xpc->findnodes('/m:measCollecFile/m:measData/m:measInfo', $doc)) { 
    my $endTime = $xpc->findvalue('m:granPeriod/@endTime', $measInfoNode); 
    my $measType = $xpc->findvalue('m:measType', $measInfoNode); 
    for my $measValueNode ($xpc->findnodes('m:measValue', $measInfoNode)) { 
     my $measValue = $xpc->findvalue('m:r', $measValueNode); 
     say join ":", $endTime, $measType, $measValue; 
    } 
} 
+0

Merci, ça fonctionne. Juste une petite faute de frappe, je devrais être: pour mon $ measValueNode ($ xpc-> findnodes ('m: measValue', $ measInfoNode)) Cela apportera une aide énorme dans le monde telco, puisque je ne pouvais trouver aucun exemple d'analyse ce type de XML, et voici une solution prête à l'emploi! Par ailleurs, à qui devrais-je vendre mon âme, pour obtenir une telle connaissance en Perl .. :) –

+0

Correction. . . . . . – ikegami