convert - ¿Qué biblioteca de Ruby XML recomendaría para un archivo XML de 2.4MB?
ruby parse xml (2)
Hpricot es probablemente la mejor herramienta para usted; es fácil de usar y debe manejar archivos de 2 mg sin problemas.
Speedwise libxml debería ser el mejor. Utilicé el enlace libxml2 para Python hace unos meses (en ese momento rb-libxml estaba rancio). La interfaz de transmisión funcionaba mejor para mí (LibXML :: XML :: Reader en ruby gem). Permite procesar archivos mientras se está descargando, es un poco más amigable que SAX y me permitió cargar datos de 30mb xml desde Internet a una base de datos MySQL en poco más de un minuto.
Tengo un archivo XML de 2.4 MB, una exportación de Microsoft Project (¡ojalá sea la víctima aquí!) Desde la cual se me solicita extraer ciertos detalles para volver a presentarlos. Ignorando la inteligencia o no de la solicitud, ¿qué biblioteca debo probar primero desde la perspectiva de Ruby?
Estoy al tanto de lo siguiente (sin ningún orden en particular):
Preferiría algo empaquetado como una gema Ruby, que sospecho que la biblioteca Chilkat no es.
El rendimiento no es un problema importante. No creo que deba funcionar más de una vez al día (una vez por semana es más probable). Estoy más interesado en algo que es tan fácil de usar como cualquier cosa relacionada con XML.
EDITAR: Probé los gemificados:
hpricot es, por una milla de país, el más fácil. Por ejemplo, para extraer el contenido de la etiqueta SaveVersion en este XML (guardado en un archivo llamado, digamos ''test.xml'')
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Project xmlns="http://schemas.microsoft.com/project">
<SaveVersion>12</SaveVersion>
</Project>
toma algo como esto:
doc = Hpricot.XML(open(''test.xml''))
version = (doc/:Project/:SaveVersion).first.inner_html
hpricot parece relativamente despreocupado con los espacios de nombres, que en este ejemplo está bien: solo hay uno, pero podría ser un problema con un documento complejo. Como hpricot también es muy lento, prefiero imaginarme que este sería un problema que se resuelve solo.
libxml-ruby es un orden de magnitud más rápido, comprende espacios de nombres (me tomó un buen par de horas resolver esto) y está mucho más cerca del XML metal: las consultas XPath y todas las demás cosas están ahí. Esto no es necesariamente algo bueno si, como yo, abres un documento XML solo bajo condiciones de extrema coacción. El módulo de ayuda fue en gran medida útil para proporcionar ejemplos de cómo manejar un espacio de nombres predeterminado con eficacia. Esto es más o menos con lo que terminé (no estoy de ninguna manera afirmando su belleza, corrección u otro valor, es justo donde estoy ahora):
xml_parser = XML::Parser.new
xml_parser.string = File.read(path)
doc = xml_parser.parse
@root = doc.root
@scopes = { :in_node => '''', :in_root => ''/'', :in_doc => ''//'' }
@ns_prefix = ''p''
@ns = "#{@ns_prefix}:#{@root.namespace[0].href}"
version = @root.find_first(xpath_qry("Project/SaveVersion", :in_root), @ns).content.to_i
def xpath_qry(tags, scope = :in_node)
"#{@scopes[scope]}" + tags.split(////).collect{ |tag| "#{@ns_prefix}:#{tag}"}.join(''/'')
end
Todavía estoy debatiendo los pros y los contras: libxml por su rigor extra, hpricot por el estilo puro del código de _why.
EDITAR de nuevo, algo más tarde: descubrí HappyMapper (''gem install happymapper'') que es muy prometedor, si todavía está en una etapa temprana. Es declarativo y funciona en su mayoría, aunque he descubierto un par de casos extremos para los que aún no tengo soluciones. Te permite hacer cosas como esta, que analiza mi Google Reader OPML:
module OPML
class Outline
include HappyMapper
tag ''outline''
attribute :title, String
attribute :text, String
attribute :type, String
attribute :xmlUrl, String
attribute :htmlUrl, String
has_many :outlines, Outline
end
end
xml_string = File.read("google-reader-subscriptions.xml")
sections = OPML::Outline.parse(xml_string)
Ya me encanta, aunque todavía no es perfecto.
Nokogiri envuelve libxml2 y libxslt con una API Rubyish limpia que admite espacios de nombres, consultas XPath y CSS3. Rápido, también. http://nokogiri.org/