2017-05-09 45 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。