2009-08-22 4 views
3

저는 Builder :: XmlMarkup을 사용하여 RESTful API 서버용 XML 형식의 데이터 구조를 생성하고 있습니다.Rails XML 빌더 (예 : 축소 된 XML)

최근에 필자는 Builder :: XmlMarkup의 예쁜 인쇄가 빈 요소 대신 공백 텍스트로 가득 찬 요소를 생성하는 버그를 발견했습니다. 예를 들어

이 코드 :

xml.outertag do 
    xml.list do 
    # Some code which loops through a list 
    end 
end 

하여 제조된다 : 내부리스트가 빈리스트이면

<outertag> 
    <list> 
    </list> 
</outertag> 

은, 소자가 비어 있어야 — 즉 <리스트 /> 또는 < 목록 > </list> 그러나 실제 XML은 개행과 다른 공백으로 채워진 < list> 태그입니다.

그렇다면 빌더 예쁜 인쇄를 어떻게 모두 제거 할 수 있습니까? 현재, 나는 원숭이 패치 builder :: XmlMarkup을 생각하고있다. 그래서 초기화는 : indent 매개 변수를 무시한다; after_filter도 고려하고 있습니다.

답변

3

들여 쓰기 매개 변수없이 Builder::XmlMarkup.new을 호출하면 공백이 없어야합니다.

xml = Builder::XmlMarkup.new 
xml.outertag do 
    xml.list do 
    # Some code which loops through a list 
    end 
end 

xml # => <outertag><list></list></outertag> 
0

가장 일반적으로 적용되는 것처럼 매트의 대답을 수락합니다. 그러나 내 상황은 에 대한 XML을 출력하는 API이므로 모든 URL을 통해 전반적으로 작동하는 것을 원합니다.

  1. (내 현재 솔루션) 원숭이 패치 ActionView :: TemplateHandlers :: 빌더 (매트의 대답에 따라) 0 들여 쓰기를 강제하는 간단한 플러그인을 확인하십시오

    다음은 그 두 가지 솔루션입니다. 불행하게도, ActionView :: TemplateHandlers :: Builder는 대부분 나중에 불완전한 Ruby 코드 문자열로, 나중에 평가됩니다. (. 아마 미래의 솔루션) : 여기에 포함 내 주요 모듈입니다

    module MinimalXml 
        module Builder 
        def self.included(base) 
         base.class_eval do 
         def compile(template) 
          indent = 0 
          "_set_controller_content_type(Mime::XML);" + 
          "xml = ::Builder::XmlMarkup.new(:indent => #{indent});" + 
          "self.output_buffer = xml.target!;" + 
          template.source + 
          ";xml.target!;" 
         end 
         end 
        end 
        end 
    end 
    
  2. 를 심각한 XML 기반의 웹 서비스를 검증하기 위해, 수신 및 발신 XML을 처리하는 데 필요한 나에게 발생 그 밖의 필요한 것을하십시오. 이것이 랙 미들웨어의 좋은 후보입니다. 그래서 결국은 나가는 XML을 검증 할 간단한 랙 미들웨어 레이어를 작성하고 (무효 인 경우 알람을 울리는 등) 개발 모드에 있으면 인쇄하거나 프로덕션 환경에서 압축합니다.