2013-08-12 3 views
1

Я занимаюсь с большим XML-документом для партнерской программы, содержащей информацию о продукте для компьютерных игр. Ниже приведен пример примера.Xpath Nokogiri Nested

<prod id="743854322"> 
    <pId>GS811CF</pId> 
    <text> 
     <name>Tour De France 2013</name> 
     <desc>Platform: XBOX 360 Publisher: FOCUS HOME INTER Genre: SPORTS Supported Languages: English</desc> 
    </text> 
    <uri> 
     <awTrack>http://www.awin1.com/pclick.php?p=743854322&amp;a=161542&amp;m=3026</awTrack> 
     <awImage>http://images.productserve.com/preview/3026/743854322.jpg</awImage> 
     <mLink>http://tracking.searchmarketing.com/click.asp?aid=520005430000038657</mLink> 
     <mImage>http://images2.drct2u.com/content/images/products/gs/gs811/gs811_xb2to52.jpg</mImage> 
    </uri> 
    <price curr="GBP"> 
     <buynow>47.00</buynow> 
     <delivery>3.99</delivery> 
    </price> 
    <cat> 
     <awCatId>579</awCatId> 
     <awCat>Video Games</awCat><mCat>Main Menu|Electricals|Gaming &amp;amp; Consoles|Video Games</mCat> 
    </cat> 
    <brand> 
     <awBrandId>427</awBrandId> 
     <brandName>Xbox 360</brandName> 
    </brand> 
</prod> 

Я хотел бы быть в состоянии найти этот документ на имя компьютерной игры, которая равна «Tour De France 2013», а также на Xbox «Платформа: XBOX 360».

Я пробовал пару вещей с xpath, но, похоже, не могу добиться того, чего хочу. Мне было интересно, как вы, ребята, займетесь этим.

Я пробовал (Это работает ... но я не хочу, чтобы с помощью содержит метод для «имя»)

result = file.xpath("//prod[contains(.,\"Tour De France 2013\") and contains(.,\"Platform: XBOX 360\")]")[0] 
# => #<Nokogiri::XML::Element:0x2b6e23c name="prod" attributes=[#<Nokogiri::XML::Attr:0x2b6e19c name="id" value="743854322">] children=[#<Nokogiri::XML::Element:0x2b6db84 name="pId" children=[#<Nokogiri::XML::Text:0x2b6d850 "GS811CF">]>, #<Nokogiri::XML::Element:0x2b6d5d0 name="text" children=[#<Nokogiri::XML::Element:0x2b6d300 name="name" children=[#<Nokogiri::XML::Text:0x2b6d094 "Tour De France 2013">]>, #<Nokogiri::XML::Element:0x2b6ce14 name="desc" children=[#<Nokogiri::XML::Text:0x2b6cb1c "Platform: XBOX 360 Publisher: FOCUS HOME INTER Genre: SPORTS Supported Languages: English">]>]>, #<Nokogiri::XML::Element:0x2b6c680 name="uri" children=[#<Nokogiri::XML::Element:0x2b70334 name="awTrack" children=[#<Nokogiri::XML::Text:0x2b70078 "http://www.awin1.com/pclick.php?p=743854322&a=161542&m=3026">]>, #<Nokogiri::XML::Element:0x2b6fd94 name="awImage" children=[#<Nokogiri::XML::Text:0x2b6fb14 "http://images.productserve.com/preview/3026/743854322.jpg">]>, #<Nokogiri::XML::Element:0x2b6f81c name="mLink" children=[#<Nokogiri::XML::Text:0x2b6f510 "http://tracking.searchmarketing.com/click.asp?aid=520005430000038657">]>, #<Nokogiri::XML::Element:0x2b6f290 name="mImage" children=[#<Nokogiri::XML::Text:0x2b6efd4 "http://images2.drct2u.com/content/images/products/gs/gs811/gs811_xb2to52.jpg">]>]>, #<Nokogiri::XML::Element:0x2b6ebec name="price" attributes=[#<Nokogiri::XML::Attr:0x2b6eb74 name="curr" value="GBP">] children=[#<Nokogiri::XML::Element:0x2b7256c name="buynow" children=[#<Nokogiri::XML::Text:0x2b72274 "47.00">]>, #<Nokogiri::XML::Element:0x2b71f7c name="delivery" children=[#<Nokogiri::XML::Text:0x2b71d10 "3.99">]>]>, #<Nokogiri::XML::Element:0x2b717d4 name="cat" children=[#<Nokogiri::XML::Element:0x2b7152c name="awCatId" children=[#<Nokogiri::XML::Text:0x2b7125c "579">]>, #<Nokogiri::XML::Element:0x2b70ff0 name="awCat" children=[#<Nokogiri::XML::Text:0x2b70d84 "Video Games">]>, #<Nokogiri::XML::Element:0x2b70a64 name="mCat" children=[#<Nokogiri::XML::Text:0x2b707bc "Main Menu|Electricals|Gaming &amp; Consoles|Video Games">]>]>, #<Nokogiri::XML::Element:0x2b742cc name="brand" children=[#<Nokogiri::XML::Element:0x2b73fd4 name="awBrandId" children=[#<Nokogiri::XML::Text:0x2b73d54 "427">]>, #<Nokogiri::XML::Element:0x2b73a84 name="brandName" children=[#<Nokogiri::XML::Text:0x2b737c8 "Xbox 360">]>]>]> 

Так я тогда пытался (возвращает NIL):

result = file.xpath("//prod[contains(.,\"Platform: PS3\") and name = \Tour De France 2013\"]")[0] 
#=> nil 

Я изо всех сил пытаюсь получить доступ к «имени» - я думаю, это может быть потому, что он глубоко вложен. Но я не знаю, как это сделать.

+1

Вы пробовали много разных вещей, по всей видимости. Так что это? Покажите нам, что вы пробовали, и объясните, почему они не работают (ошибки и т. Д.). Начало любого вопроса SO заключается в том, чтобы поместить туда некоторый код, чтобы мы могли * видеть * то, что вы пытаетесь сделать. – Arran

+0

Спасибо, я попытался дать более подробно выше. –

ответ

3

Вы можете использовать следующие XPath для проверки узла прод с определенным текстом в имени и по алфавиту узлов:

'//prod[text/name="Tour De France 2013" and text/desc[contains(text(), "Platform: XBOX 360")]]' 

Например:

file.at_xpath('//prod[text/name="Tour De France 2013" and text/desc[contains(text(), "Platform: XBOX 360")]]')['id'] 
#=> "743854322" 
+0

Ты красивый человек. Спасибо. –

+0

Из любопытства какая разница между .xpath и .at_xpath? –

+0

'.xpath' возвращает набор узлов всех совпадающих узлов. '.at_xpath' вернет первый узел, который соответствует. Если вы ищете только 1 совпадение, использование '.at_xpath' проще, чем выполнение .xpath ('path') [0]'. Вы можете увидеть документацию - http://nokogiri.org/Nokogiri/XML/Node.html. –

Смежные вопросы