2013-04-25 10 views
12

Tôi đang cố gắng xây dựng XML bằng Nokogiri với một số thẻ có cả thuộc tính và văn bản thuần trong thẻ. Vì vậy, tôi đang cố gắng để có được như thế này:đặt thuộc tính thẻ và thêm nội dung văn bản thuần túy vào thẻ bằng cách sử dụng công cụ xây dựng nokogiri (ruby)

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

Sử dụng builder Tôi có điều này:

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

mà ám vào:

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

Vì vậy, nó tạo ra <Option b="hive" class="text">hello</Option> nơi tôi sẽ chỉ giống như là <Option b="hive">hello</Option>

Tôi không chắc chắn làm thế nào để làm điều đó. Nếu tôi cố gắng để có được một đối tượng Nokogiri bằng cách cho nó XML mà tôi muốn, nó sẽ trả về chính xác những gì tôi cần với nội dung bên trong thẻ <Option> được đặt thành children=[#<Nokogiri::XML::Text:0x80b9e3dc "hello">] và tôi không biết cách thiết lập từ trình tạo.

Nếu có ai có tham chiếu đến điều đó trong tài liệu Nokogiri, tôi sẽ đánh giá cao nó.

Trả lời

30

Có hai phương pháp bạn có thể sử dụng.

Sử dụng .text

Bạn có thể gọi phương thức .text để thiết lập các văn bản của một node:

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

trong đó sản xuất:

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

Giải pháp tham số sử dụng văn bản

Hoặc, bạn có thể chuyển văn bản dưới dạng tham số. Văn bản phải được chuyển vào trước giá trị thuộc tính. Nói cách khác, thẻ được thêm vào trong các hình thức:

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

Trong trường hợp này, những người xây dựng mong muốn sẽ là:

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

Tạo XML giống nhau:

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

Cảm ơn bạn! Điều đó đã làm nó! Một upvote cho bạn, thưa bạn. – fflyer05