2015-02-10 181 views
1

我正在使用perl轉換XML文件JSON。我能夠編寫用於將輸入XML文件轉換爲Json格式的代碼。使用Perl將XML轉換爲JSON

下面是示例XML:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
    <Person SchemaVersion="1.0.8"> 
     <ID>0</ID> 

     <Home ID="ABC-XYZ" State="Unknown"> 
     <Location> 
      <SiteName></SiteName> 
      <Number>62</Number> 
      <MaxSize>0</MaxSize> 
      <Comment></Comment> 
     </Location> 

     <Laptop> 
      <FileName>/usr/temp/RPM_020515_.tar.gz</FileName> 
     </Laptop> 
    </Home> 
    </Person> 

樣品Perl代碼做JSON的轉換:

#!/usr/bin/perl 

use JSON; 
use XML::Simple; 

# Create the object of XML Simple 
my $xmlSimple = new XML::Simple(KeepRoot => 1); 

# Load the xml file in object 
my $dataXML = $xmlSimple->XMLin("input/path/to/above/XMLFILE"); 

# use encode json function to convert xml object in json. 
my $jsonString = encode_json($dataXML); 

# finally print json 
print $jsonString; 

輸出JSON值:

{ 
    "Person": { 
     "ID": "0", 
     "SchemaVersion": "1.0.8", 
     "Home": { 
      "ID": "ABC-XYZ", 

      "Laptop": { 
      "FileName": "/usr/temp/RPM_020515_.tar.gz" 
      }, 

      "Location": { 
       "Number": "62", 
       "MaxSize": "0", 
       "Comment": { }, 
       "SiteName": { } 
      }, 

      "State": "Unknown" 
     } 
    } 
} 

上面的代碼是工作的罰款。

我的問題是,這是我實際上卡住了。

我需要再做一件事以及JSON轉換,它檢查XML中的元素「FileName」是否爲空。如果它沒有提取它的價值。

So output will be two things: 
1. XML To JSON convert (working fine) 
2. Along with point 1. extract the value of nested element in XML   
    "FileName". I need that for some business logic need in next step. 

一些Perl專家可以幫助我,並建議我如何在當前的Perl代碼中做到這一點。

感謝您提前幫忙。 這是我的第一個Perl腳本,所以請原諒,如果這是一個太小的問題要問。

嘗試閱讀perl文檔,但沒有那麼有用。

注意:我試圖只使用perl內置的庫,而不是任何新的第三方庫,這是我使用XML :: Simple的原因。它的生產代碼限制(非常差的界限)。我希望XML :: Simple或JSON中存在這樣的東西。

+0

您可能想閱讀[這篇文章](http://www.perlmonks.org/index.pl ?node_id = 218480)使用XML :: Simple。有一件事讓我擔心你的代碼是否有可重複的XML元素?例如,一個''可以有多個''? – 2015-02-10 23:06:51

+2

不要使用XML :: Simple。事實並非如此。它適用於簡單的XML。嘗試像XML :: Twig這樣的東西。 – Sobrique 2015-02-10 23:09:58

+1

Re。 *「我正在嘗試僅使用構建在庫中的perl而不是任何新的第三方庫,這是我使用XML :: Simple的原因。」* XML :: Simple'不是核心模塊...還有什麼其他非內核你的公司認爲模塊可以接受嗎? – ThisSuitIsBlackNot 2015-02-10 23:09:59

回答

1

正如XML::Simple文檔所述,它將XML「鑿鑿」成類似於輸入XML的數據結構。因此,找出XML的內容,只把它作爲哈希參考很可能是:

if ($dataXML->{Person}{Home}{ID} eq 'foo') { 
    # Some action 
    ... 
} 
+0

是的這應該工作,但只適用於那些XML時元素「文件名」的路徑始終相同,但如果路徑然後這將不會產生所需的值。你能提出一些不硬編碼的東西嗎? – user1188611 2015-02-10 22:54:58

+0

你必須走數據結構,但我會建議Data :: Diver,或者獲取支持xpath的XML庫 - http://stackoverflow.com/questions/3700069/how-cani-i-檢查是否存在一個深度per-hash – Oesor 2015-02-10 22:56:33

+0

我不能重現你提到的方式,你可以舉一個例子嗎? – user1188611 2015-02-11 02:47:46

1

您應該使用XML::LibXML而不是XML ::簡單。然後使用xpath來查詢每個文檔。我會看看XML::XML2JSON的代碼,看看它是否可以很好地解決問題...

+0

所以你的意思是說,如果我使用XML :: Simple我不會能夠獲得特定元素「FileName」的值,我需要重新設計我的原始Perl代碼......最初,我從XML開始:XML2JSON,但不能以我上面顯示的格式生成JSON ... – user1188611 2015-02-11 02:46:02

+0

因此,您不僅將XML從XML轉換爲JSON,還將從一種數據結構轉換爲另一種數據結構。我想你有問題合併子元素與元素屬性。 – lnrdo 2015-02-13 20:24:01