在 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文件。
您的示例代码不会生成您想要的内容,因为您这样做时会丢弃 some
和 more
节点:
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>
有一些关于此主题的帖子,但我无法弄清楚如何解决我的问题。
我有两个 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文件。
您的示例代码不会生成您想要的内容,因为您这样做时会丢弃 some
和 more
节点:
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>