我正在尝试使用Nokogiri构建XML,其中一些标签在标签内部同时具有属性和纯文本。所以我想尝试这个:
<?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文档中提到了这一点,我将不胜感激。
答案 0 :(得分:37)
您可以使用两种方法。
使用.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>