Ошибка синтаксического анализа XML: нежелательная после элемента документа. Рельсы строитель - PullRequest
1 голос
/ 10 сентября 2009

Я пытаюсь отправить отправку 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

Почему рельсы помещают это в документ и как мне от него избавиться?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 10 сентября 2009

Оказывается, что происходило то, что 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
1 голос
/ 04 июня 2010

Эй, спасибо тебе большое! У меня была такая же проблема, и он чесал голову, пытаясь понять, что происходит на земле.

У меня была простая функция, подобная этой

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 builder от другой функции

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.

...