2011-11-16 58 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> 
相关问题