打印一个XML文档,顶部没有XML标题行

我只是想找到如何使用Nokogiri::XML::DocumentNokogiri::XML::DocumentFragment创建Nokogiri::XML::DocumentFragment

或者,我想在Nokogiri::XML::DocumentFragment上使用xPath。 我无法确定如何做到这一点,但我成功解析了Nokogiri::XML::Document

我后来将解析和修改过的DocumentFragment在另一段XML中,但我真的被我认为是一些非常简单的事情所困扰。

就像尝试在doc或to_xml上执行to_xml一样,而不是在顶部包含那个xml行。 为什么这么难?

在没有前导“PI”( 处理指令 )的情况下获取Document的XML的最简单方法是在根元素而不是文档本身上调用to_s

 require 'nokogiri' doc = Nokogiri.XML('') puts doc #=>  #=>  puts doc.root #=>  

但是,在文档或构建器级别执行此操作的“正确”方法是使用SaveOptions

 formatted_no_decl = Nokogiri::XML::Node::SaveOptions::FORMAT + Nokogiri::XML::Node::SaveOptions::NO_DECLARATION puts doc.to_xml( save_with:formatted_no_decl ) #=>  # Making your code shorter, but horribly confusing for future readers puts doc.to_xml save_with:3 #=>  


请注意, DocumentFragment 不会自动包含此PI:

 frag = Nokogiri::XML::DocumentFragment.parse('') puts frag #=>  

如果您在片段输出中看到PI,则表示在解析它时它就在那里。

 xml = '' frag = Nokogiri::XML::DocumentFragment.parse(xml) puts frag #=>  

如果是这样,并且你想要摆脱任何PI,你可以这样做, 应该能够用一点XPath:

 frag.xpath('//processing-instruction()').remove puts frag 

…除了因为DocumentFragments中的XPath奇怪而无法正常工作 。 要解决这些错误,请执行以下操作:

 # To remove only PIs at the root level of the fragment frag.xpath('processing-instruction()').remove puts frag #=>  # Alternatively, to remove all PIs everywhere, including inside child nodes frag.xpath('processing-instruction()|.//processing-instruction()').remove 


如果您有Builder对象,请执行以下任一操作:

 builder = Nokogiri::XML::Builder.new{ |xml| xml.hello(world:"true") } puts builder.to_xml #=>  #=>  puts builder.doc.root.to_xml #=>  formatted_no_decl = Nokogiri::XML::Node::SaveOptions::FORMAT + Nokogiri::XML::Node::SaveOptions::NO_DECLARATION puts builder.to_xml save_with:formatted_no_decl #=>  

以下是如何在rails中执行此操作: skip_instruct: true

  ['array of', 'strings'].to_xml skip_instruct: true, skip_types: true => "\n array of\n strings\n\n"