2011-01-12 77 views
1

我想要做的是讀取此XML中所有節點的值,並將它們放入數組中。這應該是簡單的,但由於某種原因,這使我瘋狂。Ruby - Nokogiri - 需要將node.value放入數組

XML

<ArrayOfAddress> 
<Address> 
<AddressId>297424fe-cfff-4ee1-8faa-162971d2645f</AddressId> 
<FirstName>George</FirstName> 
<LastName>Washington</LastName> 
<Address1>123 Main St</Address1> 
<Address2>Apt #611</Address2> 
<City>New York</City> 
<State>NY</State> 
<PostalCode>10110</PostalCode> 
<CountryCode>US</CountryCode> 
<EmailAddress>[email protected]</EmailAddress> 
<PhoneNumber>5555551234</PhoneNumber> 
<AddressType>CustomerAddress</AddressType> 
</Address> 
</ArrayOfAddress> 

代碼

class MassageRepsone 
def parse_resp 
    @@get_address.url_builder #URL passed through HTTPClient - @@resp is the xml above 
     doc = Nokogiri::XML::Reader(@@resp) 
     @@values = doc.each do |node| 
     node.value 
    end 
end 

    @@get_address.parse_resp 
    obj = [@@values] 
    Array(obj) 
    p obj 
end 

從上面的代碼片段返回如下:

297424fe-cfff-4ee1-8faa-162971d2645f 


George 


Washington 


123 Main St 


Apt #622 


New York 


NY 


10110 


US 


test.test.com 


5555551234 


CustomerAddress 

我試圖把@@值的字符串和應用格格但只是將換行符打印爲零,並將值放在引號內。不知道下一步是什麼,或者如果我需要與Nokogiri以不同的方式處理。

+0

請修正您的代碼的格式。 – cam 2011-01-12 20:10:58

+0

問題的一部分是你不瞭解Nokogiri,但是你也不明白Ruby會用`each'來做什麼,或者理解如何使用`each`來創建一個集合。另外,知道你爲什麼要使用`each`和`map`會有助於你的代碼。此外,您需要了解何時使用`@@`與`@`創建局部變量。 – 2011-01-12 21:42:36

+0

是的,我在學習。 @@ vs @與局部變量的原因是因爲我創建了在各種文件中的類之間使用的類變量和實例變量。我正在提煉,並感謝你的幫助。 – r3nrut 2011-01-12 21:45:48

回答

3

你的問題是,這種代碼...

@@values = doc.each do |node| 
    node.value 
end 

...調用每個節點上node.value,但當時並沒有任何與結果。 Array#each返回迭代的數組,這就是您正在設置的@@values。但doc.each不具有文檔中的所有節點。

也許你想:

# Find all text nodes and extract them individually 
@values = doc.xpath('//text()').map{ |node| node.text } 

這是很難確定,因爲你不解釋一下什麼陣列應該像到底。也許你想:

@addresses = doc.css('Address').map do |address| 
    address.xpath('.//text()').map{ |node| node.text } 
end 

...它會給你一個陣列的每個<Address>元素的數組,填入該元素的值。

4

這是我會做什麼,似乎你問:

require 'ap' 
require 'nokogiri' 

xml = <<XML 
<ArrayOfAddress> 
<Address> 
<AddressId>297424fe-cfff-4ee1-8faa-162971d2645f</AddressId> 
<FirstName>George</FirstName> 
<LastName>Washington</LastName> 
<Address1>123 Main St</Address1> 
<Address2>Apt #611</Address2> 
<City>New York</City> 
<State>NY</State> 
<PostalCode>10110</PostalCode> 
<CountryCode>US</CountryCode> 
<EmailAddress>[email protected]</EmailAddress> 
<PhoneNumber>5555551234</PhoneNumber> 
<AddressType>CustomerAddress</AddressType> 
</Address> 
</ArrayOfAddress> 
XML 

doc = Nokogiri::XML(xml) 
node_values = doc.search('//Address/*').map do |n| 
    n.text 
end 

ap node_values 

,輸出:

[ 
    [ 0] "297424fe-cfff-4ee1-8faa-162971d2645f", 
    [ 1] "George", 
    [ 2] "Washington", 
    [ 3] "123 Main St", 
    [ 4] "Apt #611", 
    [ 5] "New York", 
    [ 6] "NY", 
    [ 7] "10110", 
    [ 8] "US", 
    [ 9] "[email protected]", 
    [10] "5555551234", 
    [11] "CustomerAddress" 
] 

如果你有多個Address節點,那麼你就需要調整根據你想要處理的東西來編碼,但這並不難。