2012-09-21 22 views
6

que necesito para generar un xml para una alimentación que se ve más o menos así: -etiquetas namespace prefix y CDATA en la generación de XML para la alimentación de RSS en Ruby on Rails

<?xml version="1.0" encoding="iso-8859-1" ?> 
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0" xmlns:atom="http://www.w3.org/2005/Atom"> 
<channel> 
    <item> 
     <g:id><![CDATA[id]]></g:id> 
     <title><![CDATA[Product Name]]></title> 
     <description><![CDATA[This should be a relatively detailed description with as little formatting as possible.]]></description> 
     <g:brand>Brand X</g:brand> 
     <g:sale_id>new</g:sale_id> 
    </item> 
    <item> 
     Next product... 
    </item> 
</channel> 
</rss> 

Mi código actualmente es como la siguiente: -

xml=Builder::XmlMarkup.new(:indent => 3) 
xml.instruct! 
xml.rss("version" => "2.0" , "xmlns:g" => "http://base.google.com/ns/1.0" , "xmlns:atom" => "http://www.w3.org/2005/Atom"){ 
xml.channel{ 
# remove xml.namespace = xml.namespace_definitions.find{|ns|ns.prefix=="atom"} 
sale_products.each do |sp| 
    sid = (products_info[sp.product_id]["sale_id"]).to_s() 
    xml.item { 
    #xml.id{ |xml| xml.cdata!(products_info[sp.product_id].own_id) } 
    #xml.g :id,{ xml.cdata!("sdaf") } 
    xml.product_title{ |xml| xml.cdata!(products_info[sp.product_id].name) } 
    xml.description{ |xml| xml.cdata!(ActionController::Base.helpers.strip_tags(products_info[sp.product_id].description)) } 
    xml.item { 
     xml.brand { |xml| xml.cdata!(products_info[sp.product_id].designer_1) } 
     xml.sale_id{ |xml| xml.cdata!(sid) } 
    } 
    } 

end 
} 
} 

Mi problema está en conseguir que los prefijos de espacio de nombre y las etiquetas cdata funcionen al mismo tiempo.

xml.g :id, "fdsafsad" 

Esto obtiene el prefijo namesapce.

xml.product_title{ |xml| xml.cdata!(products_info[sp.product_id].name) } 

Esto obtiene etiquetas cdata alrededor de los valores.

xml.g :id,{ xml.cdata!("sdaf") } 

Esto no hace el truco.

¿Cómo puedo obtener tanto el prefijo de espacio de nombres como las etiquetas de cdata que funcionan al mismo tiempo para la misma etiqueta? ¿Qué estoy haciendo mal?

Editar: - La salida que actualmente estoy recibiendo es como: -

<g:id> 
    <![CDATA[10005-0003]]> 
</g:id> 

La salida que desee simplemente debe tener el valor dentro de las etiquetas CDATA (sin salto de línea, etc.): -

<g:id><![CDATA[10005-0003]]></g:id> 

Tenga en cuenta que no quiero eliminar: indent => 3 al crear el marcado, para que otras etiquetas tengan el formato requerido.

+0

¿Puede elaborar sobre el que "no hace el truco"? ¿Qué hace de hecho? Hay un error? ¿Qué producción produce? – LarsH

+0

Además, ¿por qué tienes una coma después de ': id'? – LarsH

+0

yup, hay un error. –

Respuesta

8
xml.tag!("g:id") { xml.cdata!("sdaf") } 
+0

Al poner los valores incluidos de cdata dentro de las llaves, se asegura que los valores estén sangrados y en una nueva línea, según el valor de sangría del encabezado xml). ¿Sería posible simultáneamente no tener la sangría para estos valores? ¿Es posible tener valores como "" aunque he especificado: indent => someValue al crear el marcado xml. –

+0

Lo siento, no sigo. ¿Publicará un ejemplo que muestre 1) el resultado que obtiene actualmente, y 2) el resultado que desea? –

+0

Patrick, es posible que debas notificar a @ user523146 para que vea tu comentario. – LarsH