繁体   English   中英

合并Nokogiri中的两个XML文件

[英]Merge two XML files in Nokogiri

有一些关于这个主题的帖子,但我无法弄清楚如何解决我的问题。

我有两个XML文件:

<Products>
  <Product>
    <some>
      <value></value>
    </some>
  </Product>
  <Product>
    <more>
      <data></data>
    </more>
  </Product>
</Products>

和:

<Products>
  <Product>
    <some_other>
      <value></value>
    </some_other>
  </Product>
</Products>

我想生成一个如下所示的XML文档:

<Products>
  <Product>
    <some>
      <value></value>
    </some>
  </Product>
  <Product>
    <more>
      <data></data>
    </more>
  </Product>
  <Product>
    <some_other>
      <value></value>
    </some_other>
  </Product>
</Products>

每个节点<Product>都应合并到<Products>

我尝试使用以下方法创建新文档:

doc = Nokogiri::XML("<Products></Products>")
nodes = files.map { |xml| Nokogiri::XML(xml).xpath("//Product") }
set = Nokogiri::XML::NodeSet.new(doc, nodes)

但这会引发错误: ArgumentError: node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace

我想我不理解NodeSet ,但我无法弄清楚如何合并这两个XML文件。

您的示例代码不会生成您想要的内容,因为您执行以下操作时会丢弃somemore节点:

doc = Nokogiri::XML("<Products></Products>")

您需要捎带原始数据并简单地将新节点附加到它,而不是创建一个空DOM。

require 'nokogiri'

xml1 = '<Products>
  <Product>
    <some>
      <value></value>
    </some>
  </Product>
  <Product>
    <more>
      <data></data>
    </more>
  </Product>
</Products>
'

xml2 = '<Products>
  <Product>
    <some_other>
      <value></value>
    </some_other>
  </Product>
</Products>
'

doc = Nokogiri::XML(xml1)

找到要添加的新Product节点:

new_products = Nokogiri::XML(xml2).search('Product')

将它们附加到原始文档作为Products添加子项:

doc.at('Products').add_child(new_products)

这导致doc中的DOM看起来像:

puts doc.to_xml
# >> <?xml version="1.0"?>
# >> <Products>
# >>   <Product>
# >>     <some>
# >>       <value/>
# >>     </some>
# >>   </Product>
# >>   <Product>
# >>     <more>
# >>       <data/>
# >>     </more>
# >>   </Product>
# >> <Product>
# >>     <some_other>
# >>       <value/>
# >>     </some_other>
# >>   </Product></Products>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM