代码之家  ›  专栏  ›  技术社区  ›  stellard

XML分析错误:文档元素后有垃圾邮件。轨道生成器

  •  1
  • stellard  · 技术社区  · 15 年前

    我正在尝试从操作发送XML文档

    XML由以下方法创建

    def media_xml 
        x = Builder::XmlMarkup.new
        x.instruct!
        x.declare! :DOCTYPE, :html, :PUBLIC, "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
        x.options{
            x.videos{
                for m in self.media
                    x.imageName("static-video-image.png", "target"=>"_self", "html"=>"", "flv"=> m.filename+".flv", "autoStart"=>"false")
                end
            }
        }
        x
    end
    

    在控制器中,我使用以下

    def media
        @inspection = @tag.inspections.find params[:id]
        respond_to do |format|
            format.html { render :nothing => true }
            format.xml { render :xml => @inspection.media_xml }
        end
    end
    

    下面的XML就是结果

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <options>
      <videos>
        <imageName html="" flv="3504_1245270846028.flv" autoStart="false" target="_self">static-video-image.png</imageName>
      </videos>
    </options>
    
    <respond_to?:to_xml/><to_xml/> 
    

    因为“<回应?:to_XML/><to_XML/>“另一端的分析器给出以下错误

    XML Parsing Error: junk after document element
    

    为什么Rails会将它放在文档中,我该如何处理它?

    谢谢您!

    2 回复  |  直到 14 年前
        1
  •  4
  •   stellard    15 年前

    结果发现,正在从media\u xml方法返回builder::xmlmarkup.new

    这导致对该对象的任何子IQuent调用添加更多标记,而不是调用函数。

    def media_xml 
        x = Builder::XmlMarkup.new
        x.instruct!
        x.declare! :DOCTYPE, :html, :PUBLIC, "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
        x.options{
                x.videos{
                        for m in self.media
                                x.imageName("static-video-image.png", "target"=>"_self", "html"=>"", "flv"=> m.filename+".flv", "autoStart"=>"false")
                        end
                }
        }
        #x <= removing this fixed the problem
    end
    
        2
  •  1
  •   Vicer    14 年前

    嘿,非常感谢!当时也遇到了同样的问题,我抓挠脑袋想弄清楚到底发生了什么。

    我有这样一个简单的函数

    def media_xml
      request =  Builder::XmlMarkup.new
    
      request.instruct! :xml, :version => "1.0", :encoding=>"UTF-8"
    
      request.favourites{
        request.food("banana") 
      }
    
      render :xml => media_xml
    end
    

    ..。它也犯了同样的愚蠢错误。因此,在阅读了您的文章之后,我将XML生成器分离到另一个函数

    def build_xml
      request =  Builder::XmlMarkup.new
    
      request.instruct! :xml, :version => "1.0", :encoding=>"UTF-8"
    
      request.favourites{
        request.food("banana") 
      }
    end
    

    结果是,即使我在“build_xml()”函数的末尾放了一行,如“return request”,它也会创建一个错误,因为它试图将其添加到XML对象中。