设置标记属性并使用nokogiri builder(ruby)将纯文本内容添加到标记

ffl*_*r05 14 ruby xml nokogiri

我正在尝试使用Nokogiri构建XML,其中一些标签在标签内部同时具有属性和纯文本.所以我想尝试这个:

<?xml version="1.0"?>
<Transaction requestName="OrderRequest">
  <Option b="hive">hello</Option>
</Transaction>
Run Code Online (Sandbox Code Playgroud)

使用构建器我有这个:

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

它呈现给:

<Transaction requestName="OrderRequest">
  <Option b="hive" class="text">hello</Option>
</Transaction>
Run Code Online (Sandbox Code Playgroud)

所以它产生 <Option b="hive" class="text">hello</Option> 了我想要的地方 <Option b="hive">hello</Option>

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

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

Jus*_* Ko 38

您可以使用两种方法.

运用 .text

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

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

产生:

<?xml version="1.0"?>
<Transaction requestName="OrderRequest">
  <Option b="hive">hello</Option>
</Transaction>
Run Code Online (Sandbox Code Playgroud)

解决方案使用文本参数

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

tag "text", :attribute => 'value'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所需的构建器将是:

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

生成相同的XML:

<?xml version="1.0"?>
<Transaction requestName="OrderRequest">
  <Option b="hive">hello</Option>
</Transaction>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!那就做到了!先生,为你举行投票. (2认同)