2015-12-10 68 views
1
處理

PERL的libxml分析器

<table> 
    <col1>check1</col1> 
    <col2>check2</col2> 
    <col3>check3</col3> 
    <content> 
     <data>gt1</data> 
     <data>check_gt1</data> 
    </content> 
    <content> 
     <data>gt2</data> 
     <data>check_gt2</data> 
    </content> 
</table> 

我需要

我有下面的XML我寫了下面的代碼來處理這個XML

 
my $parser = XML::LibXML->new(); 
my $respDom = $parser->parse_string($xmldata); 
my @rowNodes = $respDom->getDocumentElement->findnodes("//content"); 

if(scalar @rowNodes > 0) 
{ 
    print "\nRow nodes size is ".scalar @rowNodes."\n"; 
    foreach my $rowNode (@rowNodes) { 
      my $colNode = $rowNode->findnodes("//data")->[0];   
      my $num = $colNode->textContent; 

      print "\nNUM is ".$colNode; 
    } 
} 

顯示的節點「內容」大小我的結果是2.但它在循環內返回「gt1」兩次,在第二次迭代中不返回「gt2」。

有什麼我需要改變呢?

+0

// content中的'*'使代碼爲我返回0'@ rowNodes'。用'// content'它會給出你描述的行爲。請修復這個問題。 – simbabque

+0

謝謝。修復了問題 – Aravind

回答

1

用於查找data節點的XPath表達式是錯誤的。具有//foo的XPath將搜索具有該名稱的任何元素。它在整個文檔樹中搜索,不僅在該節點下面搜索。並且與您的->[0]它將始終返回第一個匹配,對於整個文檔是gt1

刪除斜槓。

my $colNode = $rowNode->findnodes("data")->[0]; 

要檢查$rowNode實際上包含完整的文檔樹,但只點到當前節點,試試這個:

my $colNode = $rowNode->findnodes("../content/data")->[0]; 

它也會給你gt1兩次。

+1

感謝您的回覆。你拯救了我的一天。 – Aravind

+0

是否有任何可能的方式來獲取XML作爲字符串下的「內容」 - > [0]標籤? – Aravind

+0

@Aravind你應該問一個新的問題。 – simbabque