Print an XML document without the XML header line at the top

前端 未结 2 750
忘了有多久
忘了有多久 2020-12-06 17:30

I am just trying to find out how to to a to_xml with a Nokogiri::XML::Document or a Nokogiri::XML::DocumentFragment.

Alternati

相关标签:
2条回答
  • 2020-12-06 18:09

    Here is how to do this in rails: skip_instruct: true

     ['array of', 'strings'].to_xml skip_instruct: true, skip_types: true
    
     => "<strings>\n  <string>array of</string>\n  <string>strings</string>\n</strings>\n"
    
    0 讨论(0)
  • 2020-12-06 18:18

    The simplest way to get the XML for a Document without the leading "PI" (processing instruction) is to call to_s on the root element instead of the document itself:

    require 'nokogiri'
    doc = Nokogiri.XML('<hello world="true" />')
    
    puts doc
    #=> <?xml version="1.0"?>
    #=> <hello world="true"/>
    
    puts doc.root
    #=> <hello world="true"/>
    

    The 'correct' way to do it at the document or builder level, though, is to use SaveOptions:

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

     


    Note that DocumentFragments do not automatically include this PI:

    frag = Nokogiri::XML::DocumentFragment.parse('<hello world="true" />')
    puts frag
    #=> <hello world="true"/>
    

    If you are seeing a PI in your fragment output, it means it was there when you parsed it.

    xml = '<?xml version="1.0"?><hello world="true" />'
    frag = Nokogiri::XML::DocumentFragment.parse(xml)
    puts frag
    #=> <?xml version="1.0"?><hello world="true"/>
    

    If so, and you want to get rid of any PIs, you can do so should be able to do so with a little XPath:

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

    …except that this does not appear to work due to oddness with XPath in DocumentFragments. To work around these bugs do this instead:

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

     


    If you have a Builder object, do either of:

    builder = Nokogiri::XML::Builder.new{ |xml| xml.hello(world:"true") }
    
    puts builder.to_xml
    #=> <?xml version="1.0"?>
    #=> <hello world="true"/>
    
    puts builder.doc.root.to_xml
    #=> <hello world="true"/>
    
    formatted_no_decl = Nokogiri::XML::Node::SaveOptions::FORMAT +
                        Nokogiri::XML::Node::SaveOptions::NO_DECLARATION
    
    puts builder.to_xml save_with:formatted_no_decl
    #=> <hello world="true"/>
    
    0 讨论(0)
提交回复
热议问题