打印一个XML文档,顶部没有XML标题行
我只是想找到如何使用Nokogiri::XML::Document
或Nokogiri::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"