2011-07-27 3 views
8

빌더가 'śćż'와 다른 문자를 인코딩하지 않도록 만드는 방법. 내가 원하는 것은 'całość'가 말 그대로 XML 문서에 인쇄된다는 것입니다. 예 :레일즈 + 빌더. 엔티티가없는 XML 출력 생성

xml.instruct! :xml, :version => '1.0', :encoding => 'utf-8' 
xml.Trader(:'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 
      :'xmlns:xsd' => "http://www.w3.org/2001/XMLSchema") do 
    xml.Informacje do 
    xml.RodzajPaczki 'całość' 
    xml.Program 'mine' 
    xml.WersjaProgramu '1.0' 
    end 
end 

출력 :

<?xml version="1.0" encoding="utf-8"?> 
<Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<Informacje> 
    <RodzajPaczki>ca&#322;o&#347;&#263;</RodzajPaczki> 
    <Program>mine</Program> 
    <WersjaProgramu>1.0</WersjaProgramu> 
    </Informacje> 
</Trader> 

ca&#322;o&#347;&#263;całość이어야한다. xml.RodzajPaczki {|t| t << 'całość' }과 같은 의사 솔루션을 보았지만 제대로 작동하지 않습니다. 그것은 문서의 왼쪽에있는 'całość'를 능가합니다.

답변

9

다음과 같은 현상이 발생합니다. 우리가 알고있는 것처럼 디폴트로 Builder는 całość과 같은 비 ASCII 문자를 이스케이프합니다. 또한 좀 그것을 해결하기 위해 하나의 가능한 방법을 언급했는데 즉 : 불행하게도

xml.RodzajPaczki {|t| t << 'całość' } 

당신이 RodzajPaczki 요소에 블록을 통과 할 때, 빌더는 일부 내부 XML이있을 것으로 가정, 그래서 새로운 라인을 추가 들여 쓰기를 적용합니다.

<RodzajPaczki> 
całość  </RodzajPaczki> 

쉬운 방법과이 문제를 해결하기 위해 열심히 방법이있다 : 물론 단지 내부 텍스트없이 XML이 우리의 경우에 우리는 어떤 흉한 출력 같이 얻을. 먼저 쉬운 방법.

가 모두 한 줄에 수 가리키고 것,

구성 들여 쓰기는 예상대로 제로

그런 다음 당신이 작동 xml.RodzajPaczki {|t| t << 'całość' } 모든 위에서 수정 프로그램을 사용할 수 있습니다 할 수 있지만, 출력은 꽤 인쇄되지 않습니다 :

<?xml version="1.0" encoding="UTF-8"?><Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Informacje><RodzajPaczki>całość</RodzajPaczki><Program>mine</Program><WersjaProgramu>1.0</WersjaProgramu></Informacje></Trader> 

멋지게 포맷하려면 외부 예쁜 프린터를 통해 실행할 수 있습니다.

간단히 예쁜 출력물이 있어야하고 탈출하기를 원치 않으면 Builder를 약간 패치해야합니다. 이 문제를 해결하는 것이 더 어려운 방법입니다. 빌더

패치

우리는 추가 옵션 :escape를 추가하기 위해 XmlMarkup 개체의 초기화를 패치해야합니다. 동시에이 새로운 옵션을 매개 변수로 사용하기 위해 XmlBase 개체를 패치합니다. 기본 동작을 유지하기 위해이 새로운 옵션의 기본값은 true입니다. 그런 다음 text! 메서드를 XmlBase에 패치하여 새 옵션을 사용하여 텍스트가 아닌 텍스트를 이스케이프해야하는지 결정합니다.여기처럼 보이는 것입니다 : 우리는 이제 다음과 같은 방법으로 (우리의 새로 패치 빌더를 사용할 수 있습니다

module Builder 
    class XmlBase 
    def initialize(indent=0, initial=0, encoding='utf-8', escape=true) 
     @indent = indent 
     @level = initial 
     @encoding = encoding.downcase 
     @escape = escape 
    end 

    def text!(text) 
     if @escape 
     _text(_escape(text)) 
     else 
     _text(text) 
     end 
    end 
    end 

    class XmlMarkup 
    def initialize(options={}) 
     indent = options[:indent] || 0 
     margin = options[:margin] || 0 
     encoding = options[:encoding] || 'utf-8' 
     escape = options[:escape] 
     if escape == nil 
     escape = true 
     end 
     super(indent, margin, encoding, escape) 
     @target = options[:target] || "" 
    end 
    end 
end 

통지하는 우리는 false의 값으로 우리는 우리의 새로운 :escape 옵션에 전달하는 XmlMarkup 개체를 생성 할 때)

xml = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>3, :encoding => 'utf-8', :escape => false) 
xml.instruct! :xml, :version => '1.0', :encoding => 'UTF-8' 
xml.Trader(:'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", :'xmlns:xsd' => "http://www.w3.org/2001/XMLSchema") do 
    xml.Informacje do 
    xml.RodzajPaczki('całość') 
    xml.Program('mine') 
    xml.WersjaProgramu('1.0') 
    end 
end 

출력은 다음과 같다 :

<?xml version="1.0" encoding="UTF-8"?> 
<Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Informacje> 
     <RodzajPaczki>całość</RodzajPaczki> 
     <Program>mine</Program> 
     <WersjaProgramu>1.0</WersjaProgramu> 
    </Informacje> 
</Trader> 
0,123,516

원하는대로 텍스트가 이스케이프되지 않습니다. 패치는 모든 텍스트에이 비 이스케이프 비헤이비어를 적용하므로 일부 텍스트 만 이스케이프 처리되지 않도록하고 다른 텍스트는 이스케이프 처리해야하는 경우 Builder를 훨씬 더 많이 패치해야합니다.

+0

응답이 늦어 져서 죄송합니다. 매우 유익한 대답. 고맙습니다. –

+0

뷰에서 xml 빌더 객체를 사용하는 경우 들여 쓰기를 0으로 구성 할 수 있습니까? –

0

내 설정을 사용하여이를 복제 할 수 없습니다. 어떤 버전의 루비/레일/빌더를 사용하고 있습니까?

+0

Ruby 버전 1.8.7 Enterprise Edition, Rails 2.3.5, 빌더 2.1 그러나 100 % 확실하지 않습니다. 나는 지금 직장을 잃었고 유지할 수있는 몇 가지 프로젝트를 준비하고 있습니다. –

+0

확인. 내 개인 컴퓨터에서 레일 3.0.9 루비 1.9.2와 빌더 3.0.0을 사용하여 동일한 동작을 쉽게 복제했습니다. 그래서 빌더에서 'całość'을 문자 그대로 출력하는 방법이 있는데,'ca ł o ś ć'가 아닌가? –

0

"całość"을 문제없이 출력 할 수 있습니다 (Ruby 1.9.2, Builder 3.0.0). 매뉴얼 페이지 http://builder.rubyforge.org/$KCODE'UTF8'으로 설정하고 (페이지의 맨 끝 부분을 참고하십시오), 이것이 Ruby 1.8 용이라고 생각합니다.

#!/usr/bin/ruby -wE UTF-8:UTF-8 
# encoding: UTF-8 

require 'builder' 
... 

xml = Builder::XmlMarkup.new(:target => target, :indent => 2) 
xml.instruct! :xml, :version => '1.0', :encoding => 'UTF-8' 
... 
0

Rails ticket #1446에 댓글이 빌더 3.0.0에서 수정 될 수 있음을 나타냅니다 : 난 내 파일이 어떤 은 같은 것입니다. 나는 그러나 나 자신 그러나 그것을 시도하지 않고 있었다.