解析我有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