如何使用Nokogiri将两个XML文件合并为一个?
我有两个XML文件,并希望合并它们,但不应更改已存在的标记:
XML 1:
8
XML 2:
9999 John Smith
我希望结果是这样的:
8 John Smith
以前的标签应该具有相同的值,但添加了新的标签。 这可能使用Nokogiri吗? 怎么样?
起初我试过没有Nokogiri使用:
xml1 = Hash.from_xml(' 8 ')
但是当我转换回xml(xml1.to_xml)时,我的格式错误:
"\n\n \n sdu:x\n \n 8\n \n \n\n"
使用Nokogiri,我想出了这个解决方案,但实际上,它是如此丑陋而且有一个bug。 如果xml2没有元素,它将崩溃:
require 'nokogiri' s = "8" xml1 = Nokogiri::XML.parse s s2 = "9John" xml2 = Nokogiri::XML.parse s2 def node_list elem, &proc return [] unless elem.class == Nokogiri::XML::Element str = proc.call(elem) [str] + elem.children.inject([]){|a,c| a+node_list(c,&proc)}.map{|e| "#{str}/#{e}"} end node_list(xml1.root){|e| e.name}.each do |x| caminho = '//xmlns:' + x.gsub('/', '/xmlns:') puts caminho if xml2.at_xpath( caminho ).children.children.count == 0 xml2.at_xpath( caminho ).content = xml1.at_xpath( caminho ).content end end puts xml2.to_xml
根据您的示例和所需的输出,您只需要将XML2中的mat
值替换为XML1中的mat
值。
require 'nokogiri' xml1 = Nokogiri::XML(' 8 ') xml2 = Nokogiri::XML(' 9999 John Smith ') xml2.at('mat').content = xml1.at('mat').content puts xml2.to_xml
哪个输出:
8 John Smith
这不是真正的合并,它只是一个简单的替代。 如果问题还有其他问题,那么您的示例和所需输出需要修改为更全面。
- Nokogiri用于在唯一标签集之间选择文本和html
- Nokogiri(RubyGem):查找并替换HTML标记
- 在Chrome Developer工具中使用“复制Xpath”时如何停止插入隐式标记
- Nokogiri是针对LibXML 2.7.7版本构建的,但动态加载了2.7.3
- 使用Nokogiri构建空白XML标签?
- 在Ruby 2.0.0p353(基于rvm的安装)下安装Nokogiri 1.6.1失败(OSX Mavericks)?
- 在Rails中不能要求’nokogiri’(但在irb中工作)
- Nokogiri :: XML.parse应该为换行创建单独的Text节点吗?
- nokogiri xpath属性 – 奇怪的结果