我不能重複的問題:
require 'nokogiri'
new_children = Nokogiri::XML::DocumentFragment.parse('<foo>bar</foo>')
doc = Nokogiri::XML(<<EOF)
<xml>
<lblock blockName="WINDOW_LIST" />
</xml>
EOF
lblock = doc.xpath(".//lblock[@blockName='WINDOW_LIST']").first
lblock.children = new_children # kind of NodeSet or Node
copy_doc = doc.dup(1) # or dup(0)
lblock = copy_doc.xpath(".//lblock[@blockName='WINDOW_LIST']").first # nil
puts lblock.to_xml
puts
puts doc.to_xml
運行輸出:
<lblock blockName="WINDOW_LIST">
<foo>bar</foo>
</lblock>
<?xml version="1.0"?>
<xml>
<lblock blockName="WINDOW_LIST"><foo>bar</foo></lblock>
</xml>
這就是說,這裏的被清理,爲你展示一些簡單的方法來寫代碼:
require 'nokogiri'
new_children = '<foo>bar</foo>'
doc = Nokogiri::XML(<<EOF)
<xml>
<lblock blockName="WINDOW_LIST" />
</xml>
EOF
lblock = doc.at_xpath('//lblock')
lblock.children = new_children
copy_doc = doc.dup(1)
lblock = copy_doc.at_css('lblock')
puts lblock.to_xml
puts
puts doc.to_xml
運行後也輸出:
<lblock blockName="WINDOW_LIST">
<foo>bar</foo>
</lblock>
<?xml version="1.0"?>
<xml>
<lblock blockName="WINDOW_LIST"><foo>bar</foo></lblock>
</xml>
剖析代碼:
lblock = doc.at_xpath('//lblock')
lblock = copy_doc.at_css('lblock')
這些使用查找同樣的事情的兩種不同的方式。在這種情況下,因爲示例XML很簡單,所以我使用了at
,它返回第一個匹配節點。 at_xpath
和at_css
分別適用於XPath和CSS。 at
會試圖弄清楚字符串是CSS還是XPath,通常情況下它是正確的,儘管我已經看到它被愚弄了。
lblock.children = new_children
在這種情況下,new_children
是一個字符串。 Nokogiri非常聰明,知道它應該在使用它之前將字符串轉換爲XML片段。這使得使用字符串修改XML或HTML文檔非常容易,而不必創建DocumentFragments。
'。// lblock'表示在* current *節點下找到lblock。也許'dup'ed文件沒有當前節點?你是否嘗試過絕對XPath而不是親戚? –