Как мне найти элементы в этом объекте hpricot?

Учитывая hpricot xml внизу этого поста, как мне выбрать «элемент» без использования .each? В каждом отдельном фрагменте документации используется вариант

@res.items.each do |item|
  # do stuff
end

Что в данном случае бессмысленно, потому что всегда есть только один «предмет». Я рвал на себе волосы последние века, пытаясь сделать это правильно.

Отредактировано для добавления дополнительной информации:

Итак, судя по ранним комментариям, я где-то упускаю суть, поэтому предоставлю больше информации.

Я использую ruby ​​gem под названием amazon-ecs для получения информации о продуктах от Amazon. На сайте драгоценного камня он описан как

Общий Ruby API рекламы продуктов Amazon (ранее известный как REST API для электронной коммерции) с использованием Hpricot. Он использует классы-оболочки Response и Element для простого доступа к выходным данным REST API XML. Он является общим, поэтому вы можете легко расширить Amazon::Ecs для поддержки других нереализованных операций; и объект ответа просто оборачивает объект элемента Hpricot вместо предоставления объекта/атрибутов «один к одному» для карты элементов XML.

Честно говоря, я не очень понимаю, что это значит, но я подозреваю, что часть объекта Response-обертки делает это сложным!

В основном, когда я делаю это:

@res = Amazon::Ecs.item_lookup(ean, options_hash)

а затем я распечатываю «отладка @res», я получаю то, что у меня ниже.

Надеюсь, это поможет! Завершить редактирование

Hpricot xml:

<Amazon::Ecs::Response:0xa4449cc @doc=#<Hpricot::Doc 
{xmldecl "<?xml version=\"1.0\" ?>"} 
{elem <itemlookupresponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05"> 
  {elem <operationrequest> 
    {elem <httpheaders> 
      {emptyelem <header name="UserAgent" value="Ruby">} 
    </HTTPHeaders>} 
    {elem <requestid> "b89bad91-f5a1-4daf-87f2-d309dded35d6" </RequestId>} 
    {elem <arguments> 
      {emptyelem <argument name="Operation" value="ItemLookup">} 
      {emptyelem <argument name="SearchIndex" value="Books">} 
      {emptyelem <argument name="Signature" value="dasdasdsadsadsafdfdsfsdsasadsadsd">} 
      {emptyelem <argument name="ItemId" value="9780307463746">} 
      {emptyelem <argument name="IdType" value="ISBN">} 
      {emptyelem <argument name="AWSAccessKeyId" value="sdasdsadsadsadsadsadd">} 
      {emptyelem <argument name="Timestamp" value="2011-02-17T15:08:09Z">} 
      {emptyelem <argument name="Service" value="AWSECommerceService">} 
    </Arguments>} 
    {elem <requestprocessingtime> "0.0252220000000000" </RequestProcessingTime>} 
  </OperationRequest>} 
  {elem <items> 
    {elem <request> 
      {elem <isvalid> "True" </IsValid>} 
      {elem <itemlookuprequest> 
        {elem <condition> "New" </Condition>} 
        {elem <deliverymethod> "Ship" </DeliveryMethod>} 
        {elem <idtype> "ISBN" </IdType>} 
        {elem <merchantid> "Amazon" </MerchantId>} 
        {elem <offerpage> "1" </OfferPage>} 
        {elem <itemid> "9780307463746" </ItemId>} 
        {elem <responsegroup> "Small" </ResponseGroup>} 
        {elem <reviewpage> "1" </ReviewPage>} 
        {elem <searchindex> "Books" </SearchIndex>} 
      </ItemLookupRequest>} 
    </Request>} 
    {elem <item> 
      {elem <asin> "0307463745" </ASIN>} 
      {elem <detailpageurl> "http://www.amazon.com/Rework-Jason-Fried/dp/0307463745%3FSubscriptionId%3DAKIAIV6GP6CJC3AINUUQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0307463745" </DetailPageURL>} 
      {elem <smallimage> 
        {elem <url> "http://ecx.images-amazon.com/images/I/41Qz6afdrLL._SL75_.jpg" </URL>} 
        {elem <height units="pixels"> "75" </Height>} 
        {elem <width units="pixels"> "50" </Width>} 
      </SmallImage>} 
      {elem <mediumimage> 
        {elem <url> "http://ecx.images-amazon.com/images/I/41Qz6afdrLL._SL160_.jpg" </URL>} 
        {elem <height units="pixels"> "160" </Height>} 
        {elem <width units="pixels"> "106" </Width>} 
      </MediumImage>} {elem <largeimage> {elem <url> "http://ecx.images-amazon.com/images/I/41Qz6afdrLL.jpg" </URL>} {elem <height units="pixels"> "500" </Height>} {elem <width units="pixels"> "331" </Width>} </LargeImage>} {elem <imagesets> {elem <imageset category="primary"> {elem <swatchimage> {elem <url> "http://ecx.images-amazon.com/images/I/41Qz6afdrLL._SL30_.jpg" </URL>} {elem <height units="pixels"> "30" </Height>} {elem <width units="pixels"> "20" </Width>} </SwatchImage>} {elem <smallimage> {elem <url> "http://ecx.images-amazon.com/images/I/41Qz6afdrLL._SL75_.jpg" </URL>} {elem <height units="pixels"> "75" </Height>} {elem <width units="pixels"> "50" </Width>} </SmallImage>} {elem <mediumimage> {elem <url> "http://ecx.images-amazon.com/images/I/41Qz6afdrLL._SL160_.jpg" </URL>} {elem <height units="pixels"> "160" </Height>} {elem <width units="pixels"> "106" </Width>} </MediumImage>} {elem <largeimage> {elem <url> "http://ecx.images-amazon.com/images/I/41Qz6afdrLL.jpg" </URL>} {elem <height units="pixels"> "500" </Height>} {elem <width units="pixels"> "331" </Width>} </LargeImage>} </ImageSet>} </ImageSets>}
      {elem <itemattributes> 
        {elem <author> "Jason Fried" </Author>} 
        {elem <author> "David Heinemeier Hansson" </Author>} 
        {elem <manufacturer> "Crown Business" </Manufacturer>} 
        {elem <productgroup> "Book" </ProductGroup>} 
        {elem <title> "Rework" </Title>} 
      </ItemAttributes>} 
    </Item>} 
  </Items>} 
</ItemLookupResponse>}

person David Tuite    schedule 18.02.2011    source источник
comment
Это не XML-документ. Это печатный объект Hpricot. Вы пытаетесь разобрать этот беспорядок дословно или сначала воссоздаете объект Hpricot?   -  person Mark Thomas    schedule 18.02.2011
comment
Хорошо, кажется, я совсем запутался в том, что я здесь делаю, поэтому я отредактировал ОП, чтобы попытаться предоставить больше информации.   -  person David Tuite    schedule 18.02.2011


Ответы (2)



Вы можете сделать что-то вроде этого

item = (doc/:header).first

Приведенное выше должно дать вам первый узел header в XML-документе. Это не проверено, поэтому я бы дал ему немного тестирования

person dennismonsewicz    schedule 18.02.2011
comment
Да, я тоже так думал, но я получаю NoMethodError: неопределенный метод `/' для #‹Amazon::Ecs::Response:0xade2e84›, я думаю, потому что он завернут в ответ Amazon или что-то в этом роде? - person David Tuite; 18.02.2011
comment
Я никогда не вижу необработанный xml, в основном я использую сторонний класс, метод которого просто возвращает то, что у меня есть выше. Я отредактировал ОП, чтобы предоставить больше информации. - person David Tuite; 18.02.2011