2009-08-10 17 views
2

Ich versuchte ActiveResource zu verwenden, um einen Webdienst zu analysieren, der mehr wie ein HTML-Dokument war, und ich bekam immer einen 404-Fehler.Woher wissen Sie, wann Sie einen XML-Parser verwenden und wann ActiveResource verwendet werden soll?

Muss ich anstelle von ActiveResource einen XML-Parser für diese Aufgabe verwenden?

Meine Vermutung ist, dass ActiveResource nur nützlich ist, wenn Sie Daten aus einer anderen Rails-App konsumieren und die XML-Daten leicht in ein Rails-Modell übersetzbar sind. Wenn der Web-Service z. B. ein umfangreicheres XML wie ein HTML-Dokument oder ein RSS-Feed ist, möchten Sie einen Parser wie hpricot oder nokogiri verwenden. Ist das richtig?

Woher wissen Sie, wann Sie einen XML-Parser verwenden und wann ActiveResource verwendet werden soll?

Antwort

7

Update: ActiveResource ist auch kein XML-Parser. Es ist ein REST-Consumer, mit dem Sie mit einer Remoteressource interagieren können, ähnlich wie bei einem ActiveRecord-Modell. Es verwendet einen XML-Parser unter der Haube (ich nehme an, durch ActiveSupports XmlMini, die ich unten zeige).

ActiveResource hat einige strenge Anforderungen an die Struktur des XML-Inhalts und funktioniert am besten bei der Interaktion mit der REST-API einer anderen Rails-Anwendung. Es ist nicht vorgesehen, generisches Screen Scraping einer HTML-Seite durchzuführen. Verwenden Sie dazu Nokogiri direkt.


Active ist kein XML-Parser, ist es eine verschiedene Sammlung von nützlichen Ruby-Methoden und Klassen ist. Es bietet jedoch einen Wrapper für viele verschiedene XML-Parser, die Ihnen eine konsistente Schnittstelle bieten.

Sie können sehen, welcher XML-Parser verwendet wird, und zu einem anderen XML-Parser wechseln. Versuchen Sie dies in script/console.

ActiveSupport::XmlMini.backend # => ActiveSupport::XmlMini_REXML 
ActiveSupport::XmlMini.backend = 'Nokogiri' 
ActiveSupport::XmlMini.backend # => ActiveSupport::XmlMini_Nokogiri 
# it will now use Nokogiri 

Allerdings wird das immer noch den XML-Parser in Nokogiri verwenden, der strenge, gültige Markup annimmt. Die meisten HTML-Seiten erfüllen diese strengen Anforderungen nicht und daher ist es besser, den HTML-Parser von Nokogiri direkt zu verwenden, anstatt ActiveSupport zu verwenden.

doc = Nokogiri::HTML(...) 
+0

Danke, Ryan! Ich habe tatsächlich die Anweisungen befolgt, die Sie in Ihrem ersten Screencast zur Verwendung von ActiveSupport zur Definition eines Modells und zur Weitergabe von Daten von einer App an eine andere gegeben haben. Ich habe immer 404 erhalten, obwohl die Ressource in einem Browser verfügbar war. Deshalb dachte ich, dass es etwas mit dem Format der Daten zu tun hat, die von dem externen Dienst stammen und nicht für ActiveSupport akzeptabel sind. – chimp

+0

Auf welche Episode beziehen Sie sich? Meinst du ActiveResource? – ryanb

+0

Verdammt, ich habe über ActiveSupport gesprochen, als ich ActiveResource die ganze Zeit meinte. Entschuldigen Sie. – chimp

4

Ich schrieb XmlMini, weil ich die gleiche Frage beantworten wollte. XmlMini macht nicht wirklich viel und das lässt es konzentriert bleiben. Aber wenn Sie ein Problem haben, dass YAML oder JSON nicht qualifiziert ist, wird XmlMini auch nicht die Aufgabe erledigen.

Wenn Sie zum Beispiel die XML-Struktur validieren müssen, ist XmlMini nicht das Werkzeug. Validieren von Hand ist schrecklich.

Ähnlich, wenn Sie mit Daten arbeiten, die Standardelement- und Attributsemantik von woanders wiederverwenden, wie z. B. Schnipsel von UBL, OpenDoc oder Atom, sollten Sie wirklich bessere Tools für Namespaces bekommen.

Ryanb erwähnt Nokogiri und ich kann mir nichts Schöneres für diese Dinge vorstellen. Es hat die ganze Macht von libxml, mit mehr Eleganz als fast jede Bibliothek in Ruby. Ich meine nicht nur XML-Parsing, es ist da oben mit _Whys besten Projekten.

Aber es gibt einige Dinge, für die sogar Nokogiri nicht geeignet ist. Wenn Sie wirklich, absolut, positiv jeden Winkelhalter im Raum mit halsbrecherischer Geschwindigkeit töten müssen, müssen Sie SAX ausblasen. Aber wenn Sie Geschwindigkeit so dringend brauchen, tun Sie es nicht in Ruby. Tun Sie es in expat oder libxml mit reinem C. Oder tun Sie es überhaupt nicht.

Verwandte Themen