Ecco cosa sta succedendo. Come sappiamo per impostazione predefinita, Builder sfugge ai caratteri non ASCII come quelli in całość
. Hai anche menzionato un modo possibile per risolvere il problema un pò e che è:
xml.RodzajPaczki {|t| t << 'całość' }
Purtroppo quando si passa un blocco all'elemento RodzajPaczki
, Builder presuppone che ci sarà qualche xml interno, in modo che aggiunge una nuova linea e applica il trattino. Naturalmente nel nostro caso non c'è solo testo interno e non XML in modo da ottenere un output sgradevoli come:
<RodzajPaczki>
całość </RodzajPaczki>
C'è un modo semplice e un modo più difficile per risolvere questo problema. Innanzitutto il modo semplice.
Configura Rientro a zero
quindi è possibile utilizzare la correzione dall'alto xml.RodzajPaczki {|t| t << 'całość' }
tutto funzionerà come previsto, ma l'uscita non sarà abbastanza stampato, sarà infact essere tutto su una riga:
<?xml version="1.0" encoding="UTF-8"?><Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Informacje><RodzajPaczki>całość</RodzajPaczki><Program>mine</Program><WersjaProgramu>1.0</WersjaProgramu></Informacje></Trader>
È possibile eseguire questa operazione tramite una stampante esterna carina se si desidera formattarla correttamente.
Se si deve semplicemente avere un output piuttosto stampato e non si desidera eseguire l'escape, è necessario applicare un po 'di patch a Builder. Questo è il modo più difficile per risolvere questo problema.
Patching Builder
Abbiamo bisogno di patch al di inizializzazione della nostra XmlMarkup
oggetto da aggiungere un'opzione in più :escape
. Allo stesso tempo, applichiamo una patch all'oggetto XmlBase
per prendere questa nuova opzione come parametro. Per impostazione predefinita, questa nuova opzione è impostata su true
, per mantenere il comportamento predefinito. Applichiamo quindi il patch al metodo text!
su XmlBase
per utilizzare la nostra nuova opzione per decidere se il testo deve essere ignorato.Ecco come si presenta:
module Builder
class XmlBase
def initialize(indent=0, initial=0, encoding='utf-8', escape=true)
@indent = indent
@level = initial
@encoding = encoding.downcase
@escape = escape
end
def text!(text)
if @escape
_text(_escape(text))
else
_text(text)
end
end
end
class XmlMarkup
def initialize(options={})
indent = options[:indent] || 0
margin = options[:margin] || 0
encoding = options[:encoding] || 'utf-8'
escape = options[:escape]
if escape == nil
escape = true
end
super(indent, margin, encoding, escape)
@target = options[:target] || ""
end
end
end
Ora possiamo usare il nostro costruttore di nuova patch nel modo seguente (avviso che quando si costruisce l'oggetto XmlMarkup
passiamo nelle nostre nuove :escape
opzioni con un valore di false
):
xml = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>3, :encoding => 'utf-8', :escape => false)
xml.instruct! :xml, :version => '1.0', :encoding => 'UTF-8'
xml.Trader(:'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", :'xmlns:xsd' => "http://www.w3.org/2001/XMLSchema") do
xml.Informacje do
xml.RodzajPaczki('całość')
xml.Program('mine')
xml.WersjaProgramu('1.0')
end
end
L'uscita è il seguente:
<?xml version="1.0" encoding="UTF-8"?>
<Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Informacje>
<RodzajPaczki>całość</RodzajPaczki>
<Program>mine</Program>
<WersjaProgramu>1.0</WersjaProgramu>
</Informacje>
</Trader>
Come desiderato, il testo non è sfuggito. Si noti che la patch applicherà questo comportamento di non escape a tutto il testo, quindi se si desidera che parte del testo sia non-escape mentre l'altro testo è ancora sfuggito sarà necessario applicare patch a Builder in misura molto maggiore.
Ci scusiamo per il ritardo nella risposta. Risposta molto informativa Grazie. –
È possibile configurare il rientro come zero se sto utilizzando l'oggetto del builder xml nella vista? –