2013-05-17 88 views
0

我正在JRuby(1.6.7.2)中使用Nokogiri(1.5.9-java)來複制XML模板並對其進行編輯。我在克隆文檔中發現元素時遇到問題。無法找到克隆文檔中的元素

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 

當打印to_sto_xml,所以lblock沒有與new_children。 我的錯誤在哪裏?

+0

'。// lblock'表示在* current *節點下找到lblock。也許'dup'ed文件沒有當前節點?你是否嘗試過絕對XPath而不是親戚? –

回答

0

我不能重複的問題:

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_xpathat_css分別適用於XPath和CSS。 at會試圖弄清楚字符串是CSS還是XPath,通常情況下它是正確的,儘管我已經看到它被愚弄了。

lblock.children = new_children 

在這種情況下,new_children是一個字符串。 Nokogiri非常聰明,知道它應該在使用它之前將字符串轉換爲XML片段。這使得使用字符串修改XML或HTML文檔非常容易,而不必創建DocumentFragments。