2017-08-21 1 views
0

Ich habe Tonnen von Fragen und Lösungen gelesen, um zu bestimmen, ob das schon anderswo beantwortet wurde, aber es scheint, dass keines der Dinge, die ich gefunden habe, genau das war, woran ich versuchte.Durchlaufen Elemente der XML-Datei, um festzustellen, ob sie einen Wert innerhalb eines Arrays enthalten?

Ich habe ein XML-Dokument, das Hunderte von Einträgen von Text enthält, und jeder Eintrag listet auch eine URL auf. Jede URL ist eine Zeichenfolge (innerhalb von Tags) und endet mit einer eindeutigen vierstelligen Zahl. Die XML-Datei ist im Grunde wie so formatiert:

<entry> 
[other content] 
<id>http://www.URL.com/blahblahblah-1234</id> 
[other content] 
</entry> 

Ich möchte im wesentlichen herausgreifen, um nur die URLs, die eine bestimmte Zahl am Ende hat, aus einer Liste von Zahlen. Ich gebe alle Zahlen in ein Array mit den Werten als Zeichenfolgen (numbers = ["1234", "8649", etc.]). Ich habe Nokogiri für andere Teile meines Skripts verwendet, und wenn ich nur nach einer bestimmten Saite suche, verwende ich einfach include?, was perfekt funktioniert. Ich bin mir jedoch nicht sicher, wie ich dies automatisieren soll, wenn ich Hunderte von Strings im Array "numbers" habe. Dies ist im Wesentlichen, was ich brauche, um logistisch passieren:

id = nokodoc.css("id") 

id.each { |id| 
    hyperlink = id.text 
    if hyperlink.include?(numbers) 
     puts "yes!" 
    else 
     puts "no :(" 
    end 
    } 

Offensichtlich ist dies nicht funktioniert, weil include? erwartet einen String, während ich eine ganze Reihe bin vorbei. (Zum Beispiel, wenn ich mache, funktioniert es.) Ich habe das mit any? versucht, aber es scheint in diesem Fall nicht zu funktionieren.

Gibt es eine Ruby-Methode, die ich nicht bewusst bin, die mich, ob jede der Werte innerhalb eines Arrays in vorhanden ist, jede der Knoten, die ich Schleife durch sagen? Lassen Sie mich wissen, ob das noch geklärt werden muss - die richtige Frage ist oft der schwierigste Teil!

Edit: Als Nebenbemerkung, schließlich würde Ich mag alle Einträge entfernen, die für alle Links entsprechen, die in dem Array mit einer der Zahlen nicht Ende tun, das heißt

if hyperlink.include? (any number from the array) 
    puts "this one is good" 
else 
    id.parent.remove 

So Ich würde irgendwie das Endprodukt brauchen, um mit Nokogiri pasable zu bleiben.

Vielen Dank im Voraus für alle Einsichten!

Antwort

0

Sie können dies tun:

numbers = ['1234', '8649', ..] 
urls = nokodoc.css('id').map(&:text) 
urls = urls.select { |url| numbers.any? { |n| url.include? n } } 

Aber es ist nicht effizient. Wenn Sie das Muster kennen - extrahieren Sie die Zahl und prüfen Sie, ob es im Array ist. Zum Beispiel, wenn es immer letzten 4 Stellen sind:

numbers = ['1234', '8649', ..] 
urls = nokodoc.css('id').map(&:text) 
urls = urls.select { |url| numbers.include? url[-4..-1] } 

UPDATE

Für die Änderung in der Frage:

numbers = ['1234', '8649', ..] 

nodes = nokodoc.css('id') 

nodes.each do |node| 
    url = node.text 

    if numbers.any? { |n| url.include? n } 
    puts 'this one is good' 
    else 
    node.parent.remove 
    end 
end 
+0

Das ist genau das, was ich brauchte, vielen Dank! Solch eine elegante Lösung und viel weniger kompliziert als die verschiedenen Dinge, die ich ausprobierte. Und danke, dass Sie auch die letzte Minute zu meiner Frage hinzugefügt haben! :) – lumos

Verwandte Themen