解析我有XML:复杂的XML与Perl和libxml的
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="MeasDataCollection.xsl"?>
<measCollecFile xmlns="">
<fileHeader fileFormatVersion="32.435 V7.2.0">
</fileHeader>
<measData>
<managedElement localDn="bs=8" swVersion="R21A"/>
<measInfo measInfoId="CORE,SIP_session_statistics">
<measType p="1">CPUUSAGE</measType>
<measType p="2">CPUMEM</measType>
<measType p="3">SYSMEM</measType>
<measValue measObjLdn="SGC.bsNo=17,networkRole=2">
<r p="1">10</r>
<r p="2">20</r>
<r p="3">30</r>
</measValue>
<measValue measObjLdn="SGC.bsNo=18,networkRole=2">
<r p="1">40</r>
<r p="2">50</r>
<r p="3">60</r>
</measValue>
</measInfo>
</measData>
</measCollecFile>
问题:
我想从<r p="1">40</r>
元素提取40
。唯一给出的是<measType p="1">CPUUSAGE</measType>
和<measValue measObjLdn="SGC.bsNo=18,networkRole=2">
即我只知道我需要找到bsNo=18
的CPUUSAGE
。数据的顺序始终保持不变。
这里是我到目前为止已经试过:
my $qry="//measInfo[measType/text() = 'CPUUSAGE']/measValue";
my @nodes= $conn->findnodes($qry);
foreach my $vnode (@nodes) {
if ($vnode->getAttribute('measObjLdn') =~ /'bsNo=18'/) {
foreach my $node ($vnode) {
foreach my $p ($node->getChildnodes) {
if (ref($p)=~'Element'){
$no=$p->textContent;
print $no;**#this prints the value of all the <r> elements**
}
}
}
}
}
我的挑战是可以有很多元素,如CPUUSAGE,CPUMEM ...我如何能达到在正确的顺序<r>
对于给定的measValue
属性(/'bsNo=18'/
)的顺序元素。
并随后修改40为其他所需值**,因为你对阵'bsNo=18'
的属性值,包括单引号
你尝试过这么远吗?这对于单个XPath查询来说很难做到,但解决此问题的方法并不复杂。 – amon
@amon,'/ measCollecFile/measData/measInfo/measValue [@ measObjLdn =“SGC.bsNo = 18,networkRole = 2”]/r [@p = ../../measType[text()="CPUUSAGE“ ]/@ p]' – ikegami
Catch:当只需要执行一次时,会导致对每个“r”执行'../../ measType [text()=“CPUUSAGE”]“。 – ikegami