2017-12-18 183 views
-1

我必須從xml中獲取「總計」值的值,我已經爲它編寫了perl腳本,但是對於總計xml標記路徑已經發生了一些錯誤。請指導正確的路徑。使用Perl獲取XML數據

以下是XML。

<TotalForServiceSummary> 
    <GrandTotal><![CDATA[1246.00]]></GrandTotal> 
</TotalForServiceSummary> 

腳本:

my $salesOrderNumber =s hift @ARGV; 
my $billRunID = shift @ARGV; 
my $customerNodeID = shift @ARGV; 
my $invoiceID = shift @ARGV; 
my $billRunDate =shift @ARGV; 

my $filename = "So_".$salesOrderNumber."_".$billRunID."_".$customerNodeID."_".$invoiceID."_".$billRunDate; 

my $file = `ls /svw/svwsit2b/data/server/invoices/sap_equip_invoice/$filename\*.xml`; 

my $return; 

open(XML, $file) or die "Cannot open $file for reading: $!\n"; 

while (my $line = <XML>) { 

    if ($line =~ /\<EquipSalesTotalChargeIncTax\>/i) { 
     my $xml = new XML::Simple; 
     my $ref3 = $xml->XMLin($line); 
     $return = $return . $ref3; 
    }  
} 
+1

我已經修復了你的代碼的格式(這包括添加缺少的結束'}')。不客氣,但請在將來自己做。如果您要求一羣陌生人閱讀並理解您的代碼,那麼儘可能簡單地爲他們完成該任務只是禮貌。 –

+1

顯而易見的錯誤是,示例輸入與代碼中的內容不匹配 –

+1

*「我...對於總計xml標記路徑發生了一些錯誤」*但是您的代碼不顯示任何「XML標籤路徑」。您需要展示您的真實代碼和數據才能獲得適當的幫助。 – Borodin

回答

4

有相當多的誤解回事。

您不需要一次讀取一行XML文件。你應該讓XMLIn()一次處理所有的XML - 實際上你可以傳遞它一個文件名,它將打開文件並從中讀取所有的XML。

但是,你也應該注意從XML::Simple documentation本節:

STATUS這個模塊

使用本模塊中新代碼是不鼓勵的。其他模塊是 可用,提供更直接和一致的 接口。特別強烈建議XML::LibXMLXML::Twig是一個很好的選擇。

該模塊的主要問題是大量的選項 (其中一些具有不幸的默認值)以及這些選項交互的 中的任意方式 - 通常會產生意想不到的結果。

歡迎使用修補程序和文檔修補程序的修補程序,但不可能添加新的 功能。

您應該認真考慮切換到上述替代庫之一。

而且,這兩條線沒有任何意義:

my $ref3 = $xml->XMLin($line); 
$return = $return . $ref3; 

$ref3將包含一個參考(可能爲哈希)。它的字符串表示看起來像HASH(0x12345678),這不太可能是你想要的。

更新:用XML :: LibXML解決這個問題看起來像這樣。但我懷疑你是在簡化你的問題,所以這個解決方案可能不適合你。

#!/usr/bin/perl 

use strict; 
use warnings; 
use feature 'say'; 

use XML::LibXML; 

# My XML is in "total.xml". 
my $doc = XML::LibXML->new->parse_file('total.xml'); 

say $doc->findvalue('//TotalForServiceSummary/GrandTotal'); 

更新2:你的代碼中的一些其他問題。

你行:

my $salesOrderNumber =shift @ARGV; 
my $billRunID = shift @ARGV; 

等等...

更好地寫爲:

my ($salesOrderNumber, $billRunID, $customerNodeID, 
    $invoiceID, $billRunDate) = @ARGV; 

的​​3210函數是一個跨平臺的方式來獲得文件名列表 - 無需使用外部程序像ls

請使用詞法文件句柄和open()的三參數版本。

open my $xml_fh, '<', $file 
    or die "Can't open $file: $!\n"; 

調用構造函數(new XML::Simple)的「間接對象」的方式將有可能導致你難以找到在某一點問題。代替使用更好。

+0

由於OP代碼正在查找包含「EquipSalesTotalChargeIncTax」標籤的行,因此不確定您的第一次更新是否完全正確 –

+0

@ChrisTurner:是的,我基於樣本數據而不是代碼。這就是爲什麼我說我認爲他已經過分簡化了這個問題(並且可能在這個過程中讓自己感到困惑)。 –

+0

感謝Chris&Dave提供了所有的建議和幫助,你們的人是對的,我試圖過分簡化它,因爲示例給出的是一個非常大的XML文件的一部分,也有很多'GrandTotal'標籤,但我需要獲取一個在之下。 – Vijay