2017-10-10 33 views
0

パフォーマンス統計(3gpp 32.435)を解析しようとしています。構造は私が望むほど単純ではありません。例を見てください。私が探しています結果はDOM用Perl XMLパーサー

endTime:measType:measValue 

でテキスト出力を持つことである私が値を抽出するためのperlスクリプトを使用しようとしましたが、あなたが見ることができるように、SGSN-MME_Session_SM_Gのための2つのタイプの2つの値があり、誰かが私にこのXMLを解析する方法や、親の2人の子供からの型と値を結合する方法のヒントを与えることができる場合ので、私のスクリプトの結果は

 SM.SuccActSecondPdpContext.G 
    SM.UnsuccActPdpContextCC38.G 

     1 
     473764 

です。私は感謝するだろう、感謝を...

スクリプトを使用:

#!/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(); 
    } 

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

私はXMLパーサースクリプトを探しています。これは、 "あなたに私のコードを渡す"という要求があるようです。直接の質問としてあなたの質問をすることはそれを避けるのに役立ちます;) –

答えて

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

ありがとう、それは動作します。ちょっとタイプミスがあります:私の$ measValueNode($ xpc-> findnodes( 'm:measValue'、$ measInfoNode)) これは、私が解析の例を見つけることができなかったので、電話会社の世界で大きな助けになりますこのタイプのXMLは、ここでは、使用可能なソリューションです。 ところで、誰が私の魂を売って、そのような知識をperlで得るべきですか?:) –

+0

修正。 。 。 。 。 。 – ikegami

関連する問題