2009-12-25 56 views
4

我正在使用nokogiri生成svg圖片。我想補充正確的XML序言和SVG DTD聲明得到的東西,如:使用nokogiri生成器添加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> 
... 

隨着builder我可以用instruct!declare!但我想nokogiri堅持,因爲我在我的項目中使用它的其他用途我想保持低要求。你有什麼想法嗎?

感謝

回答

2

現在,您可以(不知道從哪個版本)使用節點#create_internal_subset創建DTD節點。欲瞭解更多信息,請參閱:http://nokogiri.org/Nokogiri/XML/Builder.html

並向下滾動到「文檔類型」部分爲例。

0

雖然目前沒有出現任何的方式來增加使用Nokogiri::XML::Builder一個DOCTYPE。但是,向XML文檔中添加doctype聲明具有可疑效用,除非您的工具需要它。閱讀DTDs Don't Work on the Web by Henri Sivonen出於某些原因,爲什麼使用DTD不是一個好主意,您應該確保文檔格式正確,並根據外部模式(可能是DTD,或者可能是更強大的XSD或RELAX-NG)而不是嵌入在文檔中的DTD。

+1

我同意,但我還需要一個DTD添加到文件... – paradigmatic 2009-12-29 16:19:49

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的底部(也許最近添加),我認爲這將這樣的伎倆:

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

對於那些使用HTML,埃裏克Walkers的例子完全不是那麼回事因爲doctype會自動添加。首先,您需要將其刪除:

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

這將增加HTML5的doctype又名<!DOCTYPE html>

相關問題