2012-09-10 80 views
0

通過XML文件解析我使用的鐵軌2.3.9,1.9.3紅寶石,RubyGems的1.8.24和Windows 7旗艦版使用的libxml-紅寶石

我得到的希望安裝的libxml-紅寶石寶石我想要的輸出。我有一個超過150個節點的XML文件,我想要的是獲取每個節點的值。

require 'xml' 
my_file = 'invoice3.xml' 
parser = XML::Parser.file(my_file) 
document = parser.parse 
terminalId_node = document.find('//terminalId').first 
terminalId = terminalId_node.content 
puts terminalId 

我已經能夠獲得terminalId的值,但我想循環遍歷文件以節省編碼時間。任何幫助,將不勝感激。

更新:示例XML輸入 這僅僅是一個實際的XML文件

<invoice> 
<terminalId>68</terminalId> 
<transId>8</transId> 
<docDate>2012-08-06 18:55:57</docDate> 
<status>P</status> 
<siteId>19</siteId> 
<transCode>REL</transCode> 
<typeCode>POS</typeCode> 
<TotalQuantity>1</TotalQuantity> 
<VATRate>12</VATRate> 
<amountGrossVAT>0</amountGrossVAT> 
<amountGrossNonVAT>100</amountGrossNonVAT> 
<amountGrossZeroRated>0</amountGrossZeroRated> 
<amountGross>100</amountGross> 
<amountItemDiscount>0</amountItemDiscount> 
<amountOverallDiscount>0</amountOverallDiscount> 
<percentOverAllDiscount>0</percentOverAllDiscount> 
<OverallDiscountText></OverallDiscountText> 
<amountSeniorCitizenDiscount>0</amountSeniorCitizenDiscount> 
<AmountOriginalSeniorCitizenDiscount>0</AmountOriginalSeniorCitizenDiscount> 
<AmountCustomerPromoDiscount>0</AmountCustomerPromoDiscount> 
<amountHeaderDiscount>0</amountHeaderDiscount> 
<percentHeaderDiscount>0</percentHeaderDiscount> 
<invoice-details> 
    <invoice-detail>  
    <amountTotalDiscount>0</amountTotalDiscount> 
<percentTotalDiscount>0</percentTotalDiscount> 
<amountNetVAT>0</amountNetVAT> 
<amountNetNonVat>100</amountNetNonVat> 
<amountNetZeroRated>0</amountNetZeroRated> 
<amountNet>100</amountNet> 
<AmountVatExempt>0</AmountVatExempt> 
<amountDue>100</amountDue> 
    <invoice-detail> 
<invoice-details> 
</invoice> 

我想通過迭代提取ALL數據的一部分。

+0

請給我們示例XML輸入。另外,請特別告訴我們你想要提取什麼。 –

+0

我編輯了一個更新的問題,標記。 –

+0

https://github.com/amolpujari/reading-huge-xml –

回答

3

下面的行中檢索文檔中的所有terminalId元件,並返回包含其內容的數組:相比你的例子是

contents = document.find('//terminalId').to_a.map { |e| e.content } 

唯一的區別:

contents = document.find('//terminalId').to_a.map(&:content) 

即相當於我們不使用first(),它只請求第一個找到的元素,但to_a()檢索所有結果。