2013-04-25 14 views
12

Próbuję zbudować XML za pomocą Nokogiri z kilkoma znacznikami, które mają zarówno atrybuty, jak i zwykły tekst w tagu. Więc staram się dostać do tego:Ustaw atrybut znacznika i dodaj tekstowy tekst do znacznika za pomocą nokogiri builder (ruby)

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

Korzystanie budowniczy mam to:

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

który renderuje do:

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

więc produkuje <Option b="hive" class="text">hello</Option> gdzie ja po prostu lubię być <Option b="hive">hello</Option>

Nie jestem pewien, jak to zrobić. Jeśli próbuję uzyskać obiekt Nokogiri po prostu dostarczając żądany kod XML, to oddaje on dokładnie to, czego potrzebuję, z wewnętrznym tekstem znajdującym się w zestawie znaczników <Option> ustawionym na children=[#<Nokogiri::XML::Text:0x80b9e3dc "hello">] i nie wiem, jak ustawić to z poziomu konstruktora.

Jeśli ktoś ma odniesienie do tego w dokumentacji Nokogiri, byłbym wdzięczny.

Odpowiedz

30

Dostępne są dwa podejścia.

Korzystanie .text

można wywołać metodę .text ustawić tekst węzła:

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

która produkuje:

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

Rozwiązanie parametru za pomocą tekstu

Można również przekazać tekst jako parametr. Tekst powinien zostać przekazany przed wartościami atrybutu. Innymi słowy, znacznik jest dodawany w postaci:

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

w tym przypadku pożądane budowniczy będzie:

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

daje ten sam XML:

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

dziękuję! Tak to zrobiło! Awans dla ciebie, proszę pana. – fflyer05

Powiązane problemy