2016-10-15 3 views
0

Это моя первая попытка использования Nokogiri, но он не работает, и я не понимаю, почему:Почему мой селектор Nokogiri не работает?

Это XML:

<?xml version="1.0"?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
</catalog> 

Я использую этот код:

require 'nokogiri' 

f = File.open("test.xml") 
doc = Nokogiri::XML(f) 
nodes = doc.xpath("title") 
nodes.each do |node| 
    print node.text 
end 

Я получаю узлы как класс nil.

ответ

1

Чтобы выбрать узлы, соответствующие попробовать селектор:

nodes = doc.xpath("//title") 
+0

Теперь он работает. Что значит .xpath («title»). – InQusitive

+1

Ну вот, я думаю, вы просто выберите что-то в корне. – Ursus

+0

@InQusitive: да, вам нужно прочитать синтаксис xpath. –

0

Я бы написать код вроде:

require 'nokogiri' 

doc = Nokogiri::XML(File.read("test.xml")) 
nodes = doc.search("title") 
puts nodes.map(&:text) 

Назад к этой проблеме. Вы использовали:

nodes = doc.xpath("title") 

, который заставляет Nokogiri интерпретировать ваш селектор как XPath, и будет искать немедленный предок <catalog> именем <title>. Этого не существует. Вместо этого вам нужно будет использовать //title, если вы хотите искать по всему документу любые теги <title>.

Или, вместо того, чтобы заставить xpath, если бы вы использовали search вместо Nokogiri решили бы вы имели в виду его использовать селектор CSS title, и он работал бы правильно, так как в CSS, title будет искать по всему документ.

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

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