2009-12-25 1 views
4

나는 S12V 사진을 생성하기 위하여 nokogiri를 사용하고있다. 내가 좋아하는 뭔가를 얻을 수있는 올바른 XML 프리앰블 및 SVG의 DTD 선언을 추가하고 싶습니다 : 나는 instruct!declare! 사용할 수 buildernokogiri 건축업자를 사용하여 dtd를 추가하십시오

<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg> 
... 

을하지만 난 내 프로젝트에서 다른 용도로 사용하기 때문에 nokogiri을 고수 할 나는 요구 사항을 낮게 유지하고 싶다. 아이디어가 있습니까?

감사

답변

2

이제 할 수있는 DTD 노드를 생성 할 노드 번호의 create_internal_subset를 사용 (모르는 버전에서). 자세한 내용은 다음을 참조하십시오. http://nokogiri.org/Nokogiri/XML/Builder.html

예를 들어 '문서 유형'섹션까지 아래로 스크롤하십시오.

0

Nokogiri::XML::Builder를 사용하여 문서 타입을 추가 할 수있는 방법이있을 나타나지 않습니다. 그러나 doctype 선언을 XML 문서에 추가하는 것은 도구에서 요구하지 않는 한 불확실한 유틸리티입니다. DTDs Don't Work on the Web by Henri Sivonen을 읽으십시오. 이유는 DTD를 사용하는 것은 그리 좋은 생각이 아니며, 문서의 형식이 올바른지 확인하고 외부 스키마 (DTD 일 수도 있고 XSD처럼 강력 할 수도 있습니다)에 대해 유효성을 검사해야합니다 또는 RELAX-NG)를 사용해야합니다. 이 더러운 트릭처럼 보이지만

+1

동의하지만 나는 또한 문서에 DTD를 추가해야 HTML5의 문서 타입을 추가합니다 ... – paradigmatic

1

여기에, 가능한 솔루션입니다 :

#1. I build the svg document 
builder = Nokogiri::XML::Builder.new do |xml| 
    xml.svg do 
    # ... 
    end 
end 

#2. I retrieve the svg root node 
svg = builder.doc.xpath("/svg").first 

#3. I define and parse an xml document with the required preamble and dtd 
str =<<EOS 
<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1. /DTD/svg11.dtd"> 
EOS 
doc = Nokogiri::XML::Document.parse(str) 

#4. I add the svg node to the document above 
doc.add_child(svg) 
4

내가 트릭 할 것입니다 생각 Nokogiri::XML::Builder page의 바닥 (아마도 최근에 추가 된)에서 메모에서 다음과 같은 : HTML로 작업 사람들을 위해

builder = Nokogiri::XML::Builder.new do |xml| 
    xml.doc.create_internal_subset(
    'html', 
    "-//W3C//DTD HTML 4.01 Transitional//EN", 
    "http://www.w3.org/TR/html4/loose.dtd" 
) 
    xml.root do 
    xml.foo 
    end 
end 

puts builder.to_xml 
0

를, 에릭 워커 '예는 꽤 않습니다 doctype이 자동으로 추가되기 때문에 작동합니다. 먼저 제거해야합니다

builder = Nokogiri::HTML::Builder.new do |html| 
    html.doc.internal_subset.remove 
    html.doc.create_internal_subset('html', nil, nil) 
end 

이것은 일명, <!DOCTYPE html>