2013-04-25 15 views
12

Sto cercando di creare XML usando Nokogiri con alcuni tag che hanno sia attributi che testo semplice all'interno del tag. Così sto cercando di arrivare a questo:imposta l'attributo tag e aggiungi contenuto di testo semplice al tag usando nokogiri builder (ruby)

<?xml version="1.0"?> 
<Transaction requestName="OrderRequest"> 
    <Option b="hive">hello</Option> 
</Transaction> 

Utilizzando builder ho questo:

builder = Nokogiri::XML::Builder.new { |xml| 
    xml.Transaction("requestName" => "OrderRequest") do 
    xml.Option("b" => "hive").text("hello") 
    end 
} 

che rende a:

<Transaction requestName="OrderRequest"> 
    <Option b="hive" class="text">hello</Option> 
</Transaction> 

Quindi produce <Option b="hive" class="text">hello</Option> dove vorrei solo come se fosse <Option b="hive">hello</Option>

Non sono sicuro di come farlo. Se provo a ottenere un oggetto Nokogiri semplicemente inserendo l'XML che desidero, restituisce esattamente ciò di cui ho bisogno con il testo interno compreso nel tag <Option> impostato su children=[#<Nokogiri::XML::Text:0x80b9e3dc "hello">] e non so come impostarlo dal builder.

Se qualcuno ha un riferimento a questo nella documentazione di Nokogiri, lo apprezzerei.

risposta

30

Esistono due approcci che è possibile utilizzare.

Utilizzando .text

È possibile chiamare il metodo .text per impostare il testo di un nodo:

builder = Nokogiri::XML::Builder.new { |xml| 
    xml.Transaction("requestName" => "OrderRequest") do 
    xml.Option("b" => "hive"){ xml.text("hello") } 
    end 
} 

che produce:

<?xml version="1.0"?> 
<Transaction requestName="OrderRequest"> 
    <Option b="hive">hello</Option> 
</Transaction> 

Soluzione parametro utilizzando il testo

In alternativa, è possibile passare il testo come parametro. Il testo deve essere passato prima dei valori degli attributi. In altre parole, il tag viene aggiunto nella forma:

tag "text", :attribute => 'value' 

In questo caso, il costruttore desiderato sarebbe:

builder = Nokogiri::XML::Builder.new { |xml| 
    xml.Transaction("requestName" => "OrderRequest") do 
    xml.Option("hello", "b" => "hive") 
    end 
} 

produce lo stesso XML:

<?xml version="1.0"?> 
<Transaction requestName="OrderRequest"> 
    <Option b="hive">hello</Option> 
</Transaction> 
+2

Grazie! L'ha fatto! Un voto per te, signore. – fflyer05

Problemi correlati