Domanda

Ho provato ad utilizzare ActiveResource di analizzare un servizio web che era più come un documento HTML e ho continuato a ottenere un errore 404.

Devo utilizzare un parser XML per questo compito, invece di ActiveResource?

La mia ipotesi è che ActiveResource è utile solo se si consumano i dati da un'altra applicazione Rails ei dati XML è facilmente traducibile ad un modello di Rails. Ad esempio, se il servizio web è più ampio di XML come un documento HTML o un feed RSS, si desidera utilizzare un parser come hpricot o nokogiri. È corretto?

Come si fa a sapere quando utilizzare un parser XML e quando utilizzare ActiveResource?

È stato utile?

Soluzione

Aggiornamento: ActiveResource inoltre, non è un parser XML. Si tratta di un consumatore REST consente di interagire con una risorsa remota simile a come si farebbe con un modello di ActiveRecord. Si fa uso di un parser XML sotto il cofano (sto assumendo attraverso XmlMini di ActiveSupport mostro qui di seguito).

ActiveResource ha alcuni requisiti rigorosi sulla struttura del contenuto XML e funziona meglio quando si interagisce con l'API REST di un'altra applicazione Rails. Non è destinato a fare screen scraping generica di una pagina HTML. Per tale uso Nokogiri direttamente.


ActiveSupport non è un parser XML, si tratta di una raccolta miscellanea di metodi e classi di Ruby utili. Tuttavia, esso offre un wrapper per molti parser XML diversi dando un'interfaccia coerente.

Si può vedere che parser XML viene utilizzato e passare a un altro parser XML. Prova questo in script/console.

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

Tuttavia, ciò sarà ancora utilizzare il parser XML in Nokogiri che assume rigorosa, markup valido. La maggior parte delle pagine HTML non si adattano questo requisito rigoroso e quindi è meglio usare parser HTML di Nokogiri direttamente invece di passare attraverso ActiveSupport.

doc = Nokogiri::HTML(...)

Altri suggerimenti

ho scritto XmlMini perché volevo rispondere a questa stessa domanda. XmlMini in realtà non fa molto, e che gli permette di rimanere concentrato. Ma se avete qualsiasi problema che YAML o JSON non è qualificato per gestire, XmlMini non ha intenzione di fare il lavoro sia.

Ad esempio, se hai bisogno di convalidare la struttura del file XML si sta trattando, XmlMini non è lo strumento. Convalida a mano è terribile.

Allo stesso modo, se hai a che fare con i dati che riutilizza elemento standard e la semantica degli attributi da qualche altra parte, come tra cui frammenti di UBL, OpenDoc o Atom, si dovrebbe ottenere alcuni strumenti migliori per i namespace.

ryanb cita Nokogiri, e non riesco a pensare a qualcosa di più meraviglioso per queste cose. E 'ottenuto tutto il potere di libxml, con più eleganza di quasi qualsiasi biblioteca in Ruby. Io non intendo solo per l'analisi XML, è lì con i migliori progetti di _why.

Ma ci sono alcune cose che, anche Nokogiri non è progettato per. Se davvero, assolutamente, necessario positivamente a uccidere ogni staffa angolare in camera a rottura del collo velocità, hai avuto modo di busto fuori SAX. Ma se avete bisogno di accelerare così male, non farlo in Ruby. Farlo in expat o libxml con puro C. O non farlo affatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top