我如何添加元素?
How I can add an element?
我正在这样做:
targets = @xml.xpath("./target")
if targets.empty?
targets << Nokogiri::XML::Node.new('target', @xml)
end
然而 @xml
仍然没有我的目标。我该怎么做才能更新原来的 @xml
?
比那容易多了:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<root>
<node>
</node>
</root>
EOT
doc.at('node').children = '<child>foo</child>'
doc.to_xml
# => "<?xml version=\"1.0\"?>\n<root>\n <node><child>foo</child></node>\n</root>\n"
children=
足够聪明,可以看到您传递的内容,并会为您完成繁琐的工作。所以只需使用一个字符串来定义新节点并告诉 Nokogiri 在哪里插入它。
doc.at('node').class # => Nokogiri::XML::Element
doc.at('//node').class # => Nokogiri::XML::Element
doc.search('node').first # => #<Nokogiri::XML::Element:0x3fd1a88c5c08 name="node" children=[#<Nokogiri::XML::Text:0x3fd1a88eda3c "\n ">]>
doc.search('//node').first # => #<Nokogiri::XML::Element:0x3fd1a88c5c08 name="node" children=[#<Nokogiri::XML::Text:0x3fd1a88eda3c "\n ">]>
search
是通用的 "find a node" 方法,它将采用 CSS 或 XPath 选择器。 at
等同于 search('some selector').first
。 at_css
和 at_xpath
是 at
的特定等价物,正如 css
和 xpath
是 search
的等价物。如果需要,请使用特定版本,但通常我使用通用版本。
您不能使用:
targets = @xml.xpath("./target")
if targets.empty?
targets << Nokogiri::XML::Node.new('target', @xml)
end
如果 DOM 中不存在 ./target
,targets
将是 []
(实际上是一个空节点集)。您不能将节点附加到 []
,因为 NodeSet 不知道您在说什么,从而导致 undefined method 'children=' for nil:NilClass (NoMethodError)
异常。
相反,您必须找到要插入节点的具体位置。 at
对此有好处,因为它只找到第一个位置。当然,如果您想查找多个地方来修改某些内容,请使用 search
然后遍历返回的 NodeSet 并根据返回的各个节点进行修改。
我结束了,工作正常。
targets = @xml.xpath("./target")
if targets.empty?
targets << Nokogiri::XML::Node.new('target', @xml)
@xml.add_child(targets.first)
end
我正在这样做:
targets = @xml.xpath("./target")
if targets.empty?
targets << Nokogiri::XML::Node.new('target', @xml)
end
然而 @xml
仍然没有我的目标。我该怎么做才能更新原来的 @xml
?
比那容易多了:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<root>
<node>
</node>
</root>
EOT
doc.at('node').children = '<child>foo</child>'
doc.to_xml
# => "<?xml version=\"1.0\"?>\n<root>\n <node><child>foo</child></node>\n</root>\n"
children=
足够聪明,可以看到您传递的内容,并会为您完成繁琐的工作。所以只需使用一个字符串来定义新节点并告诉 Nokogiri 在哪里插入它。
doc.at('node').class # => Nokogiri::XML::Element
doc.at('//node').class # => Nokogiri::XML::Element
doc.search('node').first # => #<Nokogiri::XML::Element:0x3fd1a88c5c08 name="node" children=[#<Nokogiri::XML::Text:0x3fd1a88eda3c "\n ">]>
doc.search('//node').first # => #<Nokogiri::XML::Element:0x3fd1a88c5c08 name="node" children=[#<Nokogiri::XML::Text:0x3fd1a88eda3c "\n ">]>
search
是通用的 "find a node" 方法,它将采用 CSS 或 XPath 选择器。 at
等同于 search('some selector').first
。 at_css
和 at_xpath
是 at
的特定等价物,正如 css
和 xpath
是 search
的等价物。如果需要,请使用特定版本,但通常我使用通用版本。
您不能使用:
targets = @xml.xpath("./target")
if targets.empty?
targets << Nokogiri::XML::Node.new('target', @xml)
end
如果 DOM 中不存在 ./target
,targets
将是 []
(实际上是一个空节点集)。您不能将节点附加到 []
,因为 NodeSet 不知道您在说什么,从而导致 undefined method 'children=' for nil:NilClass (NoMethodError)
异常。
相反,您必须找到要插入节点的具体位置。 at
对此有好处,因为它只找到第一个位置。当然,如果您想查找多个地方来修改某些内容,请使用 search
然后遍历返回的 NodeSet 并根据返回的各个节点进行修改。
我结束了,工作正常。
targets = @xml.xpath("./target")
if targets.empty?
targets << Nokogiri::XML::Node.new('target', @xml)
@xml.add_child(targets.first)
end