2009-12-22 25 views
15

Tôi đang cố gắng xây dựng một tài liệu XML bằng Nokogiri. Một số yếu tố có dấu gạch nối trong chúng. Dưới đây là một ví dụ:Làm cách nào để tạo XML bằng cách sử dụng Nokogiri :: XML :: Builder bằng dấu gạch nối trong tên phần tử?

require "nokogiri" 
builder = Nokogiri::XML::Builder.new do |xml| 
    xml.foo_bar "hello" 
end 

puts builder.to_xml 

nào sản xuất:

<?xml version="1.0"?> 
<foo_bar>hello</foo_bar> 

Tuy nhiên, khi tôi cố gắng:

builder = Nokogiri::XML::Builder.new do |xml| 
    xml.foo-bar "hello" 
end 

tôi nhận được:

syntax error, unexpected tSTRING_BEG, expecting kDO or '{' or '(' 
    xml.foo-bar "hello" 

Bây giờ tôi nhận ra điều này là bởi vì dấu gạch nối được hiểu là foo MINUS bar.

Tôi nên làm như thế nào?

Trả lời

40

Ở đây bạn đi: Câu trả lời

require 'nokogiri' 

b = Nokogiri::XML::Builder.new do |xml| 
    xml.send(:"fooo-bar", "hello") 
end 

puts b.to_xml 
+4

nơi nào hello đến trong ? xml.send (: "foo-bar", "hello")? – Angela

+1

Tài liệu Nokogiri chính thức ở đâu? bạn có thể chia sẻ liên kết không? – yegor256

+1

@ yegor256 tại đây bạn đi: http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Builder – bonh

3

Aaron Patterson là đúng và sẽ làm việc cho tên phần tử có chứa bất kỳ ký tự mà nếu không có thể được giải thích bằng cách phân tích cú pháp Ruby.

Trả lời câu hỏi của Angela: để đặt văn bản bên trong một yếu tố tạo ra theo cách này bạn có thể làm một cái gì đó như thế này: công trình câu trả lời

require 'rubygems' 
require 'nokogiri' 

b = Nokogiri::XML::Builder.new do |xml| 
    xml.send(:'foo.bar') { 
    xml.text 'hello' 
    } 
end 

puts b.to_xml 
26

Bart Vandendriessche của nhưng có một giải pháp đơn giản hơn nếu bạn chỉ muốn một trường văn bản trong thành phần.

require 'nokogiri' 

b = Nokogiri::XML::Builder.new do |xml| 
    xml.send(:"foo-bar", 'hello') 
end 

puts b.to_xml 

Tạo:

<?xml version="1.0"?> 
<foo-bar>hello</foo-bar> 

Nếu bạn cần họ được lồng vào nhau thì bạn có thể vượt qua một khối

require 'nokogiri' 

b = Nokogiri::XML::Builder.new do |xml| 
    xml.send(:'foo-bar') { 
    xml.send(:'bar-foo', 'hello') 
    } 
end 

puts b.to_xml 

Tạo:

<?xml version="1.0"?> 
<foo-bar> 
    <bar-foo>hello</bar-foo> 
</foo-bar> 
Các vấn đề liên quan