17

我正在尝试使用 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>

我不知道该怎么做。如果我尝试通过仅向 Nokogiri 对象提供我想要的 XML 来获取它,它会准确地呈现我需要的内容,其中内部文本位于<Option>设置为的标签内children=[#<Nokogiri::XML::Text:0x80b9e3dc "hello">],我不知道如何从构建器中设置它。

如果有人在 Nokogiri 文档中有参考,我将不胜感激。

4

1 回答 1

39

您可以使用两种方法。

使用.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>
于 2013-04-25T16:57:43.677 回答