Wariant 1: Grab wszystkie elementy danych
Jeśli wszystko, co potrzebne jest, aby wymienić wszystkie elementy danych widoku za , Oto jedna wkładka:
Hash[doc.xpath("//span/@*[starts-with(name(), 'data-')]").map{|e| [e.name,e.value]}]
wyjściowa:
{"data-age"=>"50", "data-location"=>"London"}
Opcja 2: Wyniki Grupy po tagu
Jeśli chcesz pogrupować wyniki według znacznika (być może trzeba zrobić dodatkowy przetwarzanie na każdym znaczniku), można wykonać następujące czynności:
tags = []
datasets = "@*[starts-with(name(), 'data-')]"
#If you want any element, replace "span" with "*"
doc.xpath("//span[#{datasets}]").each do |tag|
tags << Hash[tag.xpath(datasets).map{|a| [a.name,a.value]}]
end
Następnie tags
jest ar promień zawierający pary skrótów wartość kluczowa, pogrupowane według tagów.
Wariant 3: Zachowanie jak jQuery zestawów danych wtyczki
Jeśli wolisz podejście plugin-jak dodaje daje dataset
metody na każdym węźle Nokogiri.
module Nokogiri
module XML
class Node
def dataset
Hash[self.xpath("@*[starts-with(name(), 'data-')]").map{|a| [a.name,a.value]}]
end
end
end
end
Następnie można znaleźć zbiór danych dla pojedynczego elementu:
doc.at_css("span").dataset
Albo dostać zestaw danych dla grupy elementów:
doc.css("span").map(&:dataset)
Przykład:
Poniżej przedstawiono zachowanie metody dataset
powyżej. Biorąc pod uwagę następujące linie w HTML:
<span data-age="50" data-location="London" class="highlight">Joe Bloggs</span>
<span data-age="40" data-location="Oxford" class="highlight">Jim Foggs</span>
Wyjście będzie:
[
{"data-location"=>"London", "data-age"=>"50"},
{"data-location"=>"Oxford", "data-age"=>"40"}
]
prowadzi link „duplikat” Pytanie jest atrybuty o _creating_ danych (i Rails specyficzne), to pytanie jest o _extracting_ je z istniejącego HTML, więc nie jest duplikatem. – matt