2012-09-10 60 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()检索所有结果。