2011-11-16 60 views
3

我正在使用Nokogiri來讀取XML文件。我將一些來自文本節點的信息存儲在一個散列中,然後我用它來編寫一個具有不同元素排序的新XML文件。我可以使用Nokogiri插入原始XML字符串嗎?

但是,我有一塊原始XML文件,我想保留原樣。我把它存儲在一個字符串通過調用「outer_xml」實例方法引入nokogiri讀者對象:

reader = Nokogiri::XML::Reader(File.open(filename)) 
reader.each do |r| 

    bg = r.outer_xml if r.name=="BuyersGuide" 

    # store stuff in hash from rest of doc 

end 

我的問題是,當我使用下面的代碼塊寫入新的XML文檔:

# Write the new file 
builder = Nokogiri::XML::Builder.new do |xml| 

    #puts xml.public_methods.sort.join(", ") 
    #break 

    xml.Data { 
    xml.Apps { 
     # writing stuff from the hash 
    } 
    } 
end 

如何將原始XML內容放入我使用Nokogiri Builder編寫的XML文件內?它已經有明確的元素在裏面,所以我不能做一個電話:

xml.BuyersGuide bg 
+1

如果你還可以發佈示例XML,我會很棒。 – Swanand

回答

2

可以使用私有方法insert這樣的:

builder = Nokogiri::XML::Builder.new do |xml| 
    xml.Data { 
    xml.Apps { 
     xml.__send__ :insert, Nokogiri::XML::DocumentFragment.parse('<foo>bar</foo>') 
     xml.__send__ :insert, existing_xml_element 
    } 
    } 
end 
+0

這正是我所需要的,我無法弄清楚如何調用這個私有方法。有用。 – AKWF

+0

我希望有一個API來管理它,而無需調用私有方法。保持私密性可能有一些更深層的原因。 – Swanand

+0

......所以如果不知道更深的原因,就不要打電話給它!使用'send'打破封裝可能是危險的。 –

5

你可以做到這一點使用公共方法(我閱讀接受的答案,但使用私有方法)是不舒服:

Nokogiri::XML::Builder.new do |xml| 
    xml.Data { 
    xml.Apps { 
     xml << '<foo>bar</foo>' 
    } 
    } 
end.to_xml 

輸出:

<?xml version="1.0"?> 
<Data> 
    <Apps> 
    <foo>bar</foo> 
    </Apps> 
</Data> 
相關問題