2015-02-12 142 views
2

我基本上是一名java開發人員,但我的客戶在perl中給了我一個小任務。任務是我將得到xml輸入,我需要搜索一個元素並打印它的值(在String變量中保存值)。例如在下面的XML我想讀取FileName標記的值。按名稱搜索XML元素值Perl

<ConnectHome SchemaVersion="1.0.8"> 
    <TransType>0090</TransType> 
    <Node> 
    <ExternalFiles> 
     <FileName>some file name</FileName> 
    </ExternalFiles> 
    </Node> 
</ConnectHome> 

我正在使用XML:簡單的庫來解析XML。而且我也可以使用下面的代碼讀取元素的值。

$xmlSimple = new XML::Simple(KeepRoot => 1); 
$dataXML = $xmlSimple->XMLin("RepeatedElement.xml"); 
my $fileNameValue = $dataXML->{ConnectHome}->{Node}->{ExternalFiles}->{FileName}; 

但我的客戶想要使用元素名稱搜索值,因爲路徑可能會在xml中更改。

"FileName" 

而不是硬編碼路徑。

所以我的問題是如何通過元素的名稱而不是硬編碼路徑獲取值?有沒有一種按名稱搜索元素的方法?我將在字符串變量中傳遞元素的名稱。

+0

你勢必'XML :: Simple'?另一個圖書館會容易得多。 – 2015-02-12 06:34:19

+0

不,我不拘一格。我也爲其他圖書館開放。你能建議一些圖書館來實現這個目標嗎?我也使用JSON庫並將此xml轉換爲json。我可以使用JSON庫嗎? – Neeraj 2015-02-12 07:00:46

+0

與另外兩家圖書館一起發佈了一個解決方案。我自己並沒有做過多的XML→JSON轉換,但應該可以使用'XML :: Twig'。我對'XML :: LibXML'不太確定,但也可能會彈出其他答案。 – 2015-02-12 07:45:20

回答

3

如果這是您唯一的任務,您可以切換到另一個庫,如XML::Twig,這將使這更容易。

Also consider this note from XML::Simple's documentation

使用本模塊中新代碼是不鼓勵。其他模塊可提供更直接和一致的接口。尤其強烈建議使用XML :: LibXML。

該模塊的主要問題是大量的選項以及這些選項交互的任意方式 - 通常會產生意想不到的結果。

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

下面是一個利用XML::Twig的例子。爲您感興趣的元素設置處理程序(在這種情況下,我將文本內容推送到數組中)。

use XML::Twig; 

my @filenames; 
my $twig = XML::Twig->new(
    twig_handlers => {FileName => sub {push @filenames, $_->text}} 
); 

$twig->parse(*DATA); 
# $twig->parsefile('RepeatedElement.xml'); # you probably want this 


say ">>$_<<"for @filenames; 

__DATA__ 
<ConnectHome SchemaVersion="1.0.8"> 
    <TransType>0090</TransType> 
    <Node> 
    <ExternalFiles> 
     <FileName>some file name</FileName> 
    </ExternalFiles> 
    </Node> 
</ConnectHome> 

你可以走另一條路是你自己採取一些基本的解析庫,像XML::ParserXML::Parser::ExpatXML::TokeParserXML::LibXML和組裝的文字,雖然這可能是這樣一個簡單的任務太繁瑣。

您也可以使用XML::XPathxpath是設計一個DOM樹中導航的查詢語言):

use XML::XPath; 

my $xp = XML::XPath->new(filename => 'RepeatedElement.xml'); 
my $filename = $xp->find('//FileName'); 
+0

非常感謝帕特里克它解決了我的問題。我使用XML :: XPath – Neeraj 2015-02-12 09:44:05

+0

而不是XML :: XPath,您可能想要使用XML :: LibXML。代碼將非常相似(XML :: LibXML也實現XPath),但速度更快,內存更少。加上XML ::的libxml實際上是維持,XML的最後一個版本:: XPath是從2003年 – mirod 2015-02-12 11:36:55

+0

@mirod:我幾乎總是使用'XML :: Twig'或其他分析模塊之一。我不想爲我不熟悉的圖書館提供解決方案。 – 2015-02-12 19:03:15