使用 Nokogiri 修改 XML 文档

Modifying an XML document with Nokogiri

我正在使用 Nokogiri 修改 XML 文件的内容:

<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="png" ContentType="image/png"/>
...
</Types>

我需要将 Default children 添加到 Types 如下:

<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="png" ContentType="image/png"/>
  <Default Extension="jpg" ContentType="image/jpeg"/>
...
</Types>

我试过:

child_node = Nokogiri::XML::Node.new "Default", @doc
@doc.xpath('//Types/Default').first.add_next_sibling(child_node)


 #but @doc.xpath('//Types/Default').first #=> nil

如何将 child 节点添加到 Types

在 Whosebug 中多次询问使用默认名称空间针对 XML 的 XPath 查询。事实上,几个小时前,我刚刚针对同一主题的 C# 问题发布了

我不知道 Ruby 具体情况,但通常,要 select 使用 XPath 的默认命名空间中的元素,您需要将前缀映射到默认命名空间 URI 并使用它XPath 中的前缀,例如:

child_node = Nokogiri::XML::Node.new "Default", @doc
result = @doc.xpath('/d:Types/d:Default', 'd' => 'http://schemas.openxmlformats.org/package/2006/content-types').first

使用Nokogiri修改节点非常容易:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
</Types>
EOT

types = doc.at('Types')
types.children = '<Default Extension="png" ContentType="image/png"/><Default Extension="jpg" ContentType="image/jpeg"/>'

puts doc.to_xml

# >> <?xml version="1.0"?>
# >> <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
# >>   <Default Extension="png" ContentType="image/png"/>
# >>   <Default Extension="jpg" ContentType="image/jpeg"/>
# >> </Types>

另一种方式可以是:

types = doc.at('Types')
[
  '<Default Extension="png" ContentType="image/png"/>',
  '<Default Extension="jpg" ContentType="image/jpeg"/>'
].each do |node|
  types.add_child(Nokogiri::XML::Node.new(node, doc))
end

puts doc.to_xml

# >> <?xml version="1.0"?>
# >> <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
# >> <<Default Extension="png" ContentType="image/png"/>/><<Default Extension="jpg" ContentType="image/jpeg"/>/></Types>

请注意,Nokogiri 很乐意将字符串形式的标签强制转换为节点并添加它。如果您要处理要插入的样板文件,这会让生活变得更轻松。