2013-04-25 46 views
12

我正在尝试使用Nokogiri和一些标签在标签内同时具有属性和纯文本来构建XML。因此,我试图去这样的:设置标签属性并使用nokogiri builder(ruby)将标签文本内容添加到标签

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

使用生成器我有这样的:

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

这使得到:

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

所以它产生 <Option b="hive" class="text">hello</Option> ,我只想喜欢它是 <Option b="hive">hello</Option>

我不知道该怎么做。如果我试图通过给它提供我想要的XML来获得Nokogiri对象,那么它会将我需要的内部文本的<Option>标记设置为children=[#<Nokogiri::XML::Text:0x80b9e3dc "hello">],并且我不知道如何从构建器设置它。

如果有人在Nokogiri文档中提到这一点,我将不胜感激。

回答

30

有两种方法可以使用。

使用.text

可以调用.text方法来设置节点的文本:

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

其产生:

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

溶液中使用文本参数

或者,您可以将文本作为参数传递。文本应该在属性值之前传入。换句话说,标签的形式加入:

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

在这种情况下,所需的建造者是:

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

产生相同的XML:

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

谢谢!那样做了!先生,祝你好运。 – fflyer05 2013-04-25 17:06:05