2015-06-19 74 views
0

我這樣做:如何添加元素?

​​

然而@xml仍然沒有我的目標。我能做些什麼來更新原始@xml

+0

Does [this question](http://stackoverflow.com/questions/939853/how-can-i-add-a-child-to-a-node-at-a-specific-position)回答你的問題? – tadman

+0

您確實應該添加與您的代碼匹配的示例XML,以及您期望的XML應該如何。不要要求我們湊齊樣本數據。 –

回答

1

這是比這更容易了很多:

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是通用的 「找點」 的方法,將採取任何CSS或XPath選擇。 at相當於search('some selector').firstat_cssat_xpathat的具體等同物,就像cssxpathsearch。如果你想使用特定的版本,但通常我使用通用版本。


不能使用:

​​

targets[](實際上是一個空節點集),如果./target不會在DOM存在。您不能追加節點到[],因爲NodeSet不知道您在說什麼,導致undefined method 'children=' for nil:NilClass (NoMethodError)異常。

相反,您必須找到要插入節點的特定位置。 at是很好的,因爲它找到了第一個位置。當然,如果你想查找多個地方來修改某些東西,請使用search,然後迭代返回的NodeSet並根據返回的各個節點進行修改。

+0

這是不可能做的xpath?事情是,我在@xml上收到一個,並且可以修改它... –

+0

無論您使用'xpath'或'css'還是'at'或任何的「查找節點」方法。重要的是你如何添加它。 –

+0

我正在選擇你的答案,因爲你提供了很多有用的信息,但請檢查答案,你會發現這樣做的缺點嗎? –

0

我結束這樣做,工作正常。

targets = @xml.xpath("./target") 
if targets.empty? 
    targets << Nokogiri::XML::Node.new('target', @xml) 
    @xml.add_child(targets.first) 
end