我正在使用Nokogiri修改XML文件的内容:
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="png" ContentType="image/png"/>
...
</Types>
我需要将Default
个孩子添加到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
如何将子节点添加到Types
?
答案 0 :(得分:2)
使用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很乐意将字符串形式的标记强制转换为节点并添加它。如果您正在处理要插入的样板,那么这可以使生活变得更加轻松。
答案 1 :(得分:0)
在StackOverflow中已经多次询问使用带有默认命名空间的XML的XPath查询。事实上,我刚刚在几个小时前就同一主题在C#问题上发布了answer。
我并不特别了解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