Ruby 使用Nokogiri修改XML文档

Ruby 使用Nokogiri修改XML文档,ruby,xml,nokogiri,Ruby,Xml,Nokogiri,我正在使用Nokogiri修改XML文件的内容: <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> <Default Extension="png" ContentType="image/png"/> ... </Types> 我试过: child_node = Nokogiri::XML::Node.new "Default", @doc @doc.

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

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

如何将子节点添加到
类型

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

我不太了解Ruby,但通常,要使用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>
需要“nokogiri”
doc=Nokogiri::XML(>
# >> 
# >>   
# >>   
# >> 
另一种方法可以是:

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>
types=doc.at('types'))
[
'',
''
].每个do |节点|
types.add_child(Nokogiri::XML::Node.new(Node,doc))
结束
将doc.xml转换为xml
# >> 
# >> 
# >> 

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

非常感谢,它很有效!
result=@doc.xpath('/d:Types/d:Default',d'=>,无需感谢我们的编辑。我们这样做是因为它改进了网站。
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>