用于DOM的Perl XML解析器
我想解析性能统计(3gpp 32.435)。结构并不像我希望的那么简单,请参阅示例。我要寻找的结果是有用于DOM的Perl XML解析器
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>
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,这里是一个现成的t使用解决方案! 顺便说一句,我应该向谁出售我的灵魂,以获得perl这样的知识.. :) –
固定。 。 。 。 。 。 – ikegami
它看起来像这个问题有一个接近的选票,因为你“开始它我正在寻找一个XML解析器脚本,“这就像你有一个”给我编码解码器“的要求。作为直接问题提出你的问题将有助于避免这种情况;) –