다음과 같은 현상이 발생합니다. 우리가 알고있는 것처럼 디폴트로 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를 훨씬 더 많이 패치해야합니다.
응답이 늦어 져서 죄송합니다. 매우 유익한 대답. 고맙습니다. –
뷰에서 xml 빌더 객체를 사용하는 경우 들여 쓰기를 0으로 구성 할 수 있습니까? –