【问题标题】:XML Parsing Error: junk after document element. Rails builderXML 解析错误:文档元素后出现垃圾。导轨生成器
【发布时间】:2009-09-09 20:57:29
【问题描述】:

我正在尝试从一个动作发送一个 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/> 

由于“”,另一端的解析器给出以下错误

XML Parsing Error: junk after document element

为什么 Rails 会把它放在文档中,我该如何摆脱它?

谢谢!

【问题讨论】:

    标签: ruby-on-rails xml respond-to


    【解决方案1】:

    原来发生的事情是 Builder::XmlMarkup.new 是从 media_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 <= removing this fixed the problem
    end
    

    【讨论】:

      【解决方案2】:

      嘿,非常感谢!遇到了同样的问题,我摸不着头脑想弄清楚到底发生了什么。

      我有一个像这样的简单函数

      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 对象中。

      【讨论】:

        猜你喜欢
        • 2010-11-24
        • 2013-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        相关资源
        最近更新 更多