2017-05-09 46 views
-2

我怎么能得到的字符串子:我如何获取子字符串?

[{ 
    "ProductId"=>198, 
    "AttributesXml"=>"<Attributes><ProductAttribute ID=\"590\"><ProductAttributeValue><Value>1691</Value></ProductAttributeValue></ProductAttribute></Attributes>", 
    "StockQuantity"=>1, 
    "AllowOutOfStockOrders"=>false, 
    "Sku"=>nil, 
    "ManufacturerPartNumber"=>nil, 
    "Gtin"=>nil, 
    "OverriddenPrice"=>nil, 
    "NotifyAdminForQuantityBelow"=>1, "Id"=>1756 
    }, 

我想要的"ProductAtrribute ID": 590才有价值。只有数字。 我已经签出了红宝石文档,但我找不到解决方案。

+0

'590'从哪里来? –

+2

您是否可以使用您正在使用的数据的完整字符串表示来更新此问题,并使用代码格式来帮助我们读取它? – ddubs

+0

对不起,我编辑了我的帖子。 590在字符串中。 –

回答

0

您可以使用scan

array = [{"ProductId"=>198, "AttributesXml"=>"<Attributes> 
    <ProductAttribute 
    ID=\"590\"><ProductAttributeValue><Value>1691</Value> 
    </ProductAttributeValue></ProductAttribute></Attributes>", 
    "StockQuantity"=>1, "AllowOutOfStockOrders"=>false,""Sku"=>nil, 
    "ManufacturerPartNumber"=>nil, "Gtin"=>nil, "OverriddenPrice"=>nil, 
    "NotifyAdminForQuantityBelow"=>1, "Id"=>1756},.. ] 

array.each do |hash| 
    hash["AttributesXml"].scan(/ProductAttribute\s+ID=\"(\d+)\"/).flatten 
    #=> ["590"] 
    # This will return matched values 
end 
+0

感谢您的回答。它工作完美。但我怎么才能得到的数字?我得到[“590”]。我怎样才能得到第一个? –

+0

我得到[“590”] [“590”] [“590”] [“590”] [“590”]。我只想要一个590. –

3

的标签有轨,如果你是在轨道,那么你可以利用引入nokogiri宝石处理解析AttributesXml部分:

require 'nokogiri' 

array = [{"ProductId"=>198, "AttributesXml"=>"<Attributes><ProductAttribute 
ID=\"590\"><ProductAttributeValue><Value>1691</Value> 
</ProductAttributeValue></ProductAttribute></Attributes>", 
"StockQuantity"=>1, "AllowOutOfStockOrders"=>false,"Sku"=>nil, 
"ManufacturerPartNumber"=>nil, "Gtin"=>nil, "OverriddenPrice"=>nil, 
"NotifyAdminForQuantityBelow"=>1, "Id"=>1756}] 

array.each do |item| 
    doc = Nokogiri::XML(item['AttributesXml']) 
    puts doc.xpath("//ProductAttribute").attribute('ID') 
end 
=> 590 
+0

谢谢你的回答。我得到这些错误:“没有将字符串隐式转换为整数”在这一点上:“doc = Nokogiri :: XML(test ['AttributesXml'])” –

+0

我该怎么办?你能帮我吗? –

+0

因为你必须在一个数组中。把它放在'each'循环中。更新答案并将测试数据放入数组中。总体思路是,在我们向您展示如何从XML字符串中提取数据之后,您应该能够使用更常见的Ruby运算符以您需要的方式修复结果。 – ddubs

1

我想用:

require 'nokogiri' 

foo = [ 
    { 
    "ProductId"=>198, 
    "AttributesXml"=>"<Attributes><ProductAttribute ID=\"590\"><ProductAttributeValue><Value>1691</Value></ProductAttributeValue></ProductAttribute></Attributes>", 
    "StockQuantity"=>1, 
    "AllowOutOfStockOrders"=>false, 
    "Sku"=>nil, 
    "ManufacturerPartNumber"=>nil, 
    "Gtin"=>nil, 
    "OverriddenPrice"=>nil, 
    "NotifyAdminForQuantityBelow"=>1, "Id"=>1756 
    }, 
] 

foo.map { |hash| 
    Nokogiri::XML(hash['AttributesXml']).at('ProductAttribute')['ID'] 
} 
# => ["590"] 

它会返回阵列中所有散列中所有<ProductAttribute>节点的ID。