【问题标题】:Perl XML parser for DOM用于 DOM 的 Perl XML 解析器
【发布时间】:2017-10-10 13:40:55
【问题描述】:

我正在尝试解析性能统计信息 (3gpp 32.435)。结构并不像我希望的那么简单,请参见示例。我正在寻找的结果是有一个文本输出

    endTime:measType:measValue

我曾尝试使用 perl 脚本来提取值,但如您所见,对于 SGSN-MME_Session_SM_G 有两种类型和两种值,所以我的脚本的结果是

     SM.SuccActSecondPdpContext.G
     SM.UnsuccActPdpContextCC38.G

        1
        473764

如果有人可以给我一个提示,如何解析这个 XML 或如何连接父级的两个子级的类型和值。不胜感激,谢谢..

使用的脚本:

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

【问题讨论】:

  • 看起来这个问题获得了密切的投票,因为您以“我正在寻找 XML 解析器脚本”开始它,读起来就像您有“给我 teh codez”的要求。将您的问题作为直接问题提出将有助于避免这种情况;)

标签: xml perl dom


【解决方案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;
   }
}

【讨论】:

  • 谢谢,它有效。我猜只是一个小错字,应该是:对于我的 $measValueNode ($xpc->findnodes('m:measValue',$measInfoNode)) 这将为电信世界带来巨大的帮助,因为我找不到任何解析这个的例子XML 类型,这是一个现成的解决方案!顺便说一句,我应该把我的灵魂卖给谁,才能在 perl 中获得这样的知识.. :)
  • 已修复。 . . . . .
猜你喜欢
  • 2013-07-24
  • 2011-05-09
  • 2012-02-28
  • 1970-01-01
  • 2022-11-04
  • 2015-04-17
  • 2013-11-15
  • 2019-02-09
  • 2010-11-24
相关资源
最近更新 更多