1

我正在尝试从一个动作发送一个 xml Doc

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/> 

由于“<respond_to?:to_xml/><to_xml/>”,另一端的解析器给出以下错误

XML Parsing Error: junk after document element

为什么 Rails 将其放入文档中,我该如何摆脱它?

谢谢!

4

2 回答 2

4

原来发生的事情是 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
于 2009-09-10T19:01:22.993 回答
1

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

我有一个像这样的简单功能

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-06-04T02:09:44.323 回答